From dac5c8798d068e2decd82b484eb095f7be610f05 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 4 Oct 2007 09:32:55 +0000 Subject: [PATCH] Copy trunk regress into Branch git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.2@5720 91ce42f0-d328-0410-95d8-f526ca767f89 --- regress/Makefile | 68 + regress/README | 204 + regress/README.mingw32 | 44 + regress/all-non-root-2tape-tests | 10 + regress/all-non-root-tape-tests | 29 + regress/all-non-root-tests | 76 + regress/all-root-tests | 14 + regress/all-tape-and-file-tests | 6 + regress/all-tests | 6 + regress/do_all | 3 + regress/do_all_tapes | 3 + regress/do_all_tests | 20 + regress/do_file | 16 + regress/encrypt-bug.jpg | Bin 0 -> 327681 bytes regress/encrypt-bug.txt | 49 + regress/encrypt-bug2.txt | 75 + regress/endtime | 12 + regress/file | 2 + regress/freebsd.conf | 38 + regress/kern.conf | 51 + regress/misc-tests | 2 + regress/prototype.conf | 50 + regress/run | 3 + regress/scripts/ansi-sd-tape.conf.in | 55 + regress/scripts/bacula-dir-2d.conf.in | 179 + regress/scripts/bacula-dir-fifo.conf.in | 226 + regress/scripts/bacula-dir-migration.conf.in | 229 + regress/scripts/bacula-dir-tape.conf.in | 240 + regress/scripts/bacula-dir-win32-tape.conf.in | 144 + regress/scripts/bacula-dir.conf.errors.in | 223 + regress/scripts/bacula-dir.conf.maxtime.in | 136 + regress/scripts/bacula-dir.conf.regexwhere.in | 136 + .../scripts/bacula-dir.conf.testrunscript.in | 221 + regress/scripts/bacula-fd-2d.conf.in | 33 + regress/scripts/bacula-sd-2d.conf.in | 70 + regress/scripts/bacula-sd-2disk-drive.conf.in | 75 + regress/scripts/bacula-sd-2disk.conf.in | 73 + regress/scripts/bacula-sd-2drive.conf.in | 75 + regress/scripts/bacula-sd-2tape.conf.in | 61 + regress/scripts/bacula-sd-fifo.conf.in | 49 + regress/scripts/bacula-sd-migration.conf.in | 72 + regress/scripts/bacula-sd-tape.conf.in | 54 + regress/scripts/bacula-sd.conf.in | 74 + regress/scripts/bconsole-2d.conf.in | 10 + regress/scripts/check_for_zombie_jobs | 84 + regress/scripts/cleanup | 25 + regress/scripts/cleanup-2drive.in | 44 + regress/scripts/cleanup-2tape.in | 30 + regress/scripts/cleanup-tape.in | 8 + regress/scripts/copy-2disk-confs | 12 + regress/scripts/copy-2disk-drive-confs | 10 + regress/scripts/copy-2drive-confs | 15 + regress/scripts/copy-2tape-confs | 15 + regress/scripts/copy-confs | 11 + regress/scripts/copy-crypto-confs | 7 + regress/scripts/copy-fifo-confs | 11 + regress/scripts/copy-migration-confs | 8 + regress/scripts/copy-tape-confs | 11 + regress/scripts/copy-test-confs | 11 + regress/scripts/copy-testa-confs | 11 + regress/scripts/copy-tls-confs | 8 + regress/scripts/copy-win32-confs | 11 + regress/scripts/crypto-bacula-fd.conf.in | 37 + regress/scripts/cryptokeypair.pem | 23 + regress/scripts/do_sed | 102 + regress/scripts/exclude-dev-test | 5 + regress/scripts/exclude-etc-test | 1 + regress/scripts/exclude-lib-test | 5 + regress/scripts/flist | 23 + regress/scripts/freebsd_tape_options | 8 + regress/scripts/functions | 204 + regress/scripts/linux_osst_tape_options | 7 + regress/scripts/linux_tape_options | 1 + regress/scripts/master2048.cert | 28 + .../scripts/multi-client-bacula-dir.conf.in | 376 + regress/scripts/new-test-bacula-dir.conf.in | 368 + regress/scripts/prepare-two-disks | 6 + regress/scripts/prepare-two-tapes.in | 41 + regress/scripts/regress-config | 29 + regress/scripts/setup | 60 + regress/scripts/test-bacula-dir.conf.in | 312 + regress/scripts/test-bacula-fd.conf.in | 33 + regress/scripts/test-bacula-sd.conf.in | 107 + regress/scripts/test-console.conf.in | 10 + regress/scripts/testa-bacula-dir.conf.in | 147 + regress/scripts/testb-bacula-dir.conf.in | 151 + regress/scripts/tls-CA.pem | 37 + regress/scripts/tls-bacula-dir.conf.in | 379 + regress/scripts/tls-bacula-fd.conf.in | 41 + regress/scripts/tls-bacula-sd.conf.in | 115 + regress/scripts/tls-cert.pem | 357 + regress/scripts/win32-bacula-dir-tape.conf.in | 159 + regress/scripts/win32-bacula-fd.conf.in | 33 + regress/scripts/win32-bacula-sd-tape.conf.in | 54 + regress/starttime | 6 + regress/tape | 2 + regress/tests/2drive-3pool-test | 83 + regress/tests/2drive-concurrent-test | 93 + regress/tests/2drive-incremental-2disk | 114 + regress/tests/2drive-incremental-2tape | 110 + regress/tests/ansi-label-tape | 91 + regress/tests/auto-label-test | 64 + regress/tests/backup-bacula-tape | 116 + regress/tests/backup-bacula-test | 92 + regress/tests/backup-to-null | 74 + regress/tests/backup-win32-tape | 48 + regress/tests/bextract-test | 56 + regress/tests/big-vol-test | 82 + regress/tests/bscan-fast-tape | 88 + regress/tests/bscan-tape | 145 + regress/tests/bscan-test | 89 + regress/tests/bsr-opt-test | 80 + regress/tests/btape-fill-full-tape | 34 + regress/tests/btape-fill-tape | 37 + regress/tests/bug-897 | 105 + regress/tests/bug-fatal-test | 45 + regress/tests/compress-encrypt-test | 49 + regress/tests/compressed-test | 54 + regress/tests/concurrent-jobs-test | 66 + regress/tests/data-encrypt-test | 53 + regress/tests/dev-test-root | 79 + regress/tests/differential-test | 87 + regress/tests/eighty-simultaneous-jobs-tape | 133 + regress/tests/encrypt-bug-test | 64 + regress/tests/eot-fail-tape | 50 + regress/tests/errors-test | 79 + regress/tests/etc-test-root | 65 + regress/tests/fast-two-pool-test | 70 + regress/tests/fifo-test | 61 + regress/tests/fixed-block-size-tape | 62 + regress/tests/four-concurrent-jobs-tape | 55 + regress/tests/four-concurrent-jobs-test | 94 + regress/tests/four-jobs-tape | 152 + regress/tests/four-jobs-test | 123 + regress/tests/gigaslam-sparse-test | 62 + regress/tests/hardlink-test | 65 + regress/tests/incremental-2disk | 104 + regress/tests/incremental-2media | 73 + regress/tests/incremental-2media-tape | 89 + regress/tests/incremental-2tape | 110 + regress/tests/incremental-tape | 75 + regress/tests/incremental-test | 170 + regress/tests/lib-tape-root | 68 + regress/tests/lib-test-root | 73 + regress/tests/maxtime-test | 80 + regress/tests/maxvol-test | 64 + regress/tests/memory-bug-tape | 20058 ++++++++++++++++ regress/tests/migration-job-test | 84 + regress/tests/migration-jobspan-test | 81 + regress/tests/migration-occupancy-test | 70 + regress/tests/migration-time-test | 77 + regress/tests/migration-volume-test | 102 + regress/tests/multi-client-test | 79 + regress/tests/query-test | 120 + regress/tests/recycle-test | 79 + regress/tests/regexwhere-test | 291 + regress/tests/relabel-tape | 94 + regress/tests/restore-by-file-tape | 100 + regress/tests/restore-by-file-test | 55 + regress/tests/restore-disk-seek-test | 93 + regress/tests/restore-seek-tape | 92 + regress/tests/restore2-by-file-test | 49 + regress/tests/runscript-test | 145 + regress/tests/scratch-pool-test | 72 + regress/tests/six-vol-test | 69 + regress/tests/small-file-size-tape | 49 + regress/tests/span-vol-test | 55 + regress/tests/sparse-compressed-test | 43 + regress/tests/sparse-encrypt-test | 70 + regress/tests/sparse-test | 45 + regress/tests/test0 | 3 + regress/tests/three-pool-recycle-test | 106 + regress/tests/three-pool-test | 83 + regress/tests/tls-test | 49 + regress/tests/truncate-bug-tape | 86 + regress/tests/two-jobs-test | 79 + regress/tests/two-pool-tape | 80 + regress/tests/two-pool-test | 77 + regress/tests/two-vol-test | 46 + regress/tests/two-volume-tape | 84 + regress/tests/two-volume-test | 68 + regress/tests/usr-tape-root | 63 + regress/tests/verify-cat-test | 49 + regress/tests/verify-vol-tape | 49 + regress/tests/verify-vol-test | 51 + regress/tests/weird-files-test | 79 + regress/tests/weird-files2-test | 83 + regress/tests/win32-backup-tape | 48 + regress/tests/win32-to-linux-tape | 48 + regress/weird-files.tar.gz | Bin 0 -> 1957 bytes regress/win32/all-non-root-2tape-tests.cmd | 11 + regress/win32/all-non-root-tape-tests.cmd | 26 + regress/win32/all-non-root-tests.cmd | 48 + regress/win32/all-root-tests.cmd | 10 + regress/win32/all-tape-and-file-tests.cmd | 5 + regress/win32/all-tests.cmd | 7 + regress/win32/config.cmd | 10 + regress/win32/make.cmd | 111 + regress/win32/prototype.conf | 31 + .../scripts/bacula-dir-migration.conf.in | 229 + regress/win32/scripts/bacula-dir-tape.conf.in | 226 + .../scripts/bacula-dir-win32-tape.conf.in | 144 + .../scripts/bacula-dir.conf.testrunscript.in | 159 + .../scripts/bacula-sd-2disk-drive.conf.in | 75 + regress/win32/scripts/bacula-sd-2disk.conf.in | 62 + .../win32/scripts/bacula-sd-2drive.conf.in | 75 + regress/win32/scripts/bacula-sd-2tape.conf.in | 61 + .../win32/scripts/bacula-sd-migration.conf.in | 72 + regress/win32/scripts/bacula-sd-tape.conf.in | 54 + regress/win32/scripts/bacula-sd.conf.in | 74 + regress/win32/scripts/bacula.cmd | 18 + .../win32/scripts/check_for_zombie_jobs.bscr | 8 + .../win32/scripts/check_for_zombie_jobs.cmd | 41 + regress/win32/scripts/cleanup-2drive.cmd.in | 43 + regress/win32/scripts/cleanup-2tape.cmd.in | 29 + regress/win32/scripts/cleanup-tape.cmd.in | 7 + regress/win32/scripts/cleanup.cmd | 23 + regress/win32/scripts/copy-2disk-confs.cmd | 9 + .../win32/scripts/copy-2disk-drive-confs.cmd | 6 + regress/win32/scripts/copy-2drive-confs.cmd | 10 + regress/win32/scripts/copy-2tape-confs.cmd | 10 + regress/win32/scripts/copy-confs.cmd | 7 + regress/win32/scripts/copy-crypto-confs.cmd | 5 + .../win32/scripts/copy-migration-confs.cmd | 7 + regress/win32/scripts/copy-tape-confs.cmd | 7 + regress/win32/scripts/copy-test-confs.cmd | 7 + regress/win32/scripts/copy-testa-confs.cmd | 7 + regress/win32/scripts/copy-win32-confs.cmd | 7 + .../win32/scripts/crypto-bacula-fd.conf.in | 36 + regress/win32/scripts/cryptokeypair.pem | 23 + regress/win32/scripts/disk-changer.cmd | 201 + regress/win32/scripts/do_sed.cmd | 73 + regress/win32/scripts/exclude-dev-test | 5 + regress/win32/scripts/exclude-etc-test | 1 + regress/win32/scripts/exclude-lib-test | 5 + regress/win32/scripts/flist | 23 + regress/win32/scripts/functions.cmd | 131 + regress/win32/scripts/install_bacula.cmd | 76 + .../win32/scripts/new-test-bacula-dir.conf.in | 326 + regress/win32/scripts/prepare-two-disks.cmd | 5 + .../win32/scripts/prepare-two-tapes.cmd.in | 13 + regress/win32/scripts/setup.cmd | 55 + regress/win32/scripts/test-bacula-dir.conf.in | 312 + regress/win32/scripts/test-bacula-fd.conf.in | 33 + regress/win32/scripts/test-bacula-sd.conf.in | 107 + regress/win32/scripts/test-console.conf.in | 10 + .../win32/scripts/testa-bacula-dir.conf.in | 147 + .../scripts/win32-bacula-dir-tape.conf.in | 159 + regress/win32/scripts/win32_tape_options | 1 + .../tests/2drive-incremental-2disk.1.bscr | 20 + .../tests/2drive-incremental-2disk.2.bscr | 25 + .../win32/tests/2drive-incremental-2disk.cmd | 57 + regress/win32/tests/2drive-incremental-2tape | 112 + regress/win32/tests/auto-label-test.bscr | 35 + regress/win32/tests/auto-label-test.cmd | 27 + regress/win32/tests/backup-bacula-tape | 117 + regress/win32/tests/backup-bacula-test.bscr | 36 + regress/win32/tests/backup-bacula-test.cmd | 24 + regress/win32/tests/backup-win32-tape | 49 + regress/win32/tests/bextract-test.bscr | 21 + regress/win32/tests/bextract-test.cmd | 29 + regress/win32/tests/bscan-fast-tape | 89 + regress/win32/tests/bscan-tape | 142 + regress/win32/tests/bscan-test.1.bscr | 24 + regress/win32/tests/bscan-test.2.bscr | 13 + regress/win32/tests/bscan-test.cmd | 42 + regress/win32/tests/bsr-opt-test.bscr | 24 + regress/win32/tests/bsr-opt-test.cmd | 57 + regress/win32/tests/btape-fill-full-tape | 35 + regress/win32/tests/btape-fill-tape | 38 + regress/win32/tests/compressed-test.bscr | 23 + regress/win32/tests/compressed-test.cmd | 24 + regress/win32/tests/concurrent-jobs-test.bscr | 23 + regress/win32/tests/concurrent-jobs-test.cmd | 35 + regress/win32/tests/dev-test-root | 85 + regress/win32/tests/differential-test.1.bscr | 9 + regress/win32/tests/differential-test.2.bscr | 9 + regress/win32/tests/differential-test.3.bscr | 16 + regress/win32/tests/differential-test.cmd | 48 + regress/win32/tests/eot-fail-tape | 51 + regress/win32/tests/etc-test-root | 70 + regress/win32/tests/fixed-block-size-tape | 62 + regress/win32/tests/four-concurrent-jobs-tape | 56 + .../tests/four-concurrent-jobs-test.bscr | 50 + .../win32/tests/four-concurrent-jobs-test.cmd | 23 + regress/win32/tests/four-jobs-tape | 153 + regress/win32/tests/four-jobs-test.1.bscr | 11 + regress/win32/tests/four-jobs-test.2.bscr | 8 + regress/win32/tests/four-jobs-test.3.bscr | 8 + regress/win32/tests/four-jobs-test.4.bscr | 8 + regress/win32/tests/four-jobs-test.5.bscr | 17 + regress/win32/tests/four-jobs-test.cmd | 74 + regress/win32/tests/hardlink-test | 66 + regress/win32/tests/incremental-2disk.1.bscr | 9 + regress/win32/tests/incremental-2disk.2.bscr | 21 + regress/win32/tests/incremental-2disk.cmd | 55 + regress/win32/tests/incremental-2tape.1.bscr | 9 + regress/win32/tests/incremental-2tape.2.bscr | 21 + regress/win32/tests/incremental-2tape.cmd | 48 + regress/win32/tests/incremental-tape | 76 + regress/win32/tests/incremental-test.1.bscr | 9 + regress/win32/tests/incremental-test.2.bscr | 9 + regress/win32/tests/incremental-test.3.bscr | 7 + regress/win32/tests/incremental-test.4.bscr | 7 + regress/win32/tests/incremental-test.5.bscr | 16 + regress/win32/tests/incremental-test.cmd | 91 + regress/win32/tests/lib-tape-root | 67 + regress/win32/tests/lib-test-root | 76 + regress/win32/tests/migration-job-test.cmd | 37 + .../win32/tests/migration-jobspan-test.cmd | 42 + .../win32/tests/migration-occupancy-test.cmd | 36 + regress/win32/tests/migration-time-test.cmd | 37 + regress/win32/tests/migration-volume-test.cmd | 40 + regress/win32/tests/query-test.1.bscr | 9 + regress/win32/tests/query-test.2.bscr | 9 + regress/win32/tests/query-test.3.bscr | 46 + regress/win32/tests/query-test.cmd | 48 + regress/win32/tests/recycle-test.bscr | 51 + regress/win32/tests/recycle-test.cmd | 26 + regress/win32/tests/relabel-tape | 94 + regress/win32/tests/restore-by-file-tape | 101 + regress/win32/tests/restore-by-file-test.bscr | 20 + regress/win32/tests/restore-by-file-test.cmd | 30 + .../win32/tests/restore-disk-seek-test.bscr | 23 + .../win32/tests/restore-disk-seek-test.cmd | 55 + .../win32/tests/restore2-by-file-test.bscr | 17 + regress/win32/tests/restore2-by-file-test.cmd | 31 + regress/win32/tests/runscript-test | 90 + regress/win32/tests/scratch-pool-test.bscr | 25 + regress/win32/tests/scratch-pool-test.cmd | 45 + regress/win32/tests/six-vol-test.bscr | 19 + regress/win32/tests/six-vol-test.cmd | 36 + regress/win32/tests/small-file-size-tape | 50 + regress/win32/tests/span-vol-test.bscr | 27 + regress/win32/tests/span-vol-test.cmd | 26 + .../win32/tests/sparse-compressed-test.bscr | 17 + .../win32/tests/sparse-compressed-test.cmd | 23 + regress/win32/tests/sparse-test.bscr | 20 + regress/win32/tests/sparse-test.cmd | 23 + regress/win32/tests/test0.cmd | 2 + regress/win32/tests/truncate-bug-tape | 87 + regress/win32/tests/two-jobs-test.1.bscr | 14 + regress/win32/tests/two-jobs-test.2.bscr | 27 + regress/win32/tests/two-jobs-test.cmd | 35 + regress/win32/tests/two-pool-tape | 82 + regress/win32/tests/two-pool-test.bscr | 36 + regress/win32/tests/two-pool-test.cmd | 37 + regress/win32/tests/two-vol-test.bscr | 19 + regress/win32/tests/two-vol-test.cmd | 24 + regress/win32/tests/two-volume-tape.1.bscr | 11 + regress/win32/tests/two-volume-tape.2.bscr | 12 + regress/win32/tests/two-volume-tape.cmd | 48 + regress/win32/tests/two-volume-test.bscr | 21 + regress/win32/tests/two-volume-test.cmd | 35 + regress/win32/tests/usr-tape-root | 62 + regress/win32/tests/verify-vol-tape | 50 + regress/win32/tests/verify-vol-test.bscr | 18 + regress/win32/tests/verify-vol-test.cmd | 29 + regress/win32/tests/weird-files-test | 69 + regress/win32/tests/weird-files2-test | 80 + regress/win32/tests/win32-backup-tape | 49 + regress/win32/tests/win32-to-linux-tape | 49 + 362 files changed, 42191 insertions(+) create mode 100644 regress/Makefile create mode 100644 regress/README create mode 100644 regress/README.mingw32 create mode 100755 regress/all-non-root-2tape-tests create mode 100755 regress/all-non-root-tape-tests create mode 100755 regress/all-non-root-tests create mode 100755 regress/all-root-tests create mode 100755 regress/all-tape-and-file-tests create mode 100755 regress/all-tests create mode 100755 regress/do_all create mode 100755 regress/do_all_tapes create mode 100755 regress/do_all_tests create mode 100755 regress/do_file create mode 100644 regress/encrypt-bug.jpg create mode 100644 regress/encrypt-bug.txt create mode 100644 regress/encrypt-bug2.txt create mode 100755 regress/endtime create mode 100755 regress/file create mode 100644 regress/freebsd.conf create mode 100644 regress/kern.conf create mode 100644 regress/misc-tests create mode 100644 regress/prototype.conf create mode 100755 regress/run create mode 100644 regress/scripts/ansi-sd-tape.conf.in create mode 100644 regress/scripts/bacula-dir-2d.conf.in create mode 100644 regress/scripts/bacula-dir-fifo.conf.in create mode 100644 regress/scripts/bacula-dir-migration.conf.in create mode 100644 regress/scripts/bacula-dir-tape.conf.in create mode 100644 regress/scripts/bacula-dir-win32-tape.conf.in create mode 100644 regress/scripts/bacula-dir.conf.errors.in create mode 100644 regress/scripts/bacula-dir.conf.maxtime.in create mode 100644 regress/scripts/bacula-dir.conf.regexwhere.in create mode 100644 regress/scripts/bacula-dir.conf.testrunscript.in create mode 100644 regress/scripts/bacula-fd-2d.conf.in create mode 100644 regress/scripts/bacula-sd-2d.conf.in create mode 100644 regress/scripts/bacula-sd-2disk-drive.conf.in create mode 100644 regress/scripts/bacula-sd-2disk.conf.in create mode 100644 regress/scripts/bacula-sd-2drive.conf.in create mode 100644 regress/scripts/bacula-sd-2tape.conf.in create mode 100644 regress/scripts/bacula-sd-fifo.conf.in create mode 100644 regress/scripts/bacula-sd-migration.conf.in create mode 100644 regress/scripts/bacula-sd-tape.conf.in create mode 100644 regress/scripts/bacula-sd.conf.in create mode 100644 regress/scripts/bconsole-2d.conf.in create mode 100755 regress/scripts/check_for_zombie_jobs create mode 100755 regress/scripts/cleanup create mode 100755 regress/scripts/cleanup-2drive.in create mode 100755 regress/scripts/cleanup-2tape.in create mode 100755 regress/scripts/cleanup-tape.in create mode 100755 regress/scripts/copy-2disk-confs create mode 100755 regress/scripts/copy-2disk-drive-confs create mode 100755 regress/scripts/copy-2drive-confs create mode 100755 regress/scripts/copy-2tape-confs create mode 100755 regress/scripts/copy-confs create mode 100755 regress/scripts/copy-crypto-confs create mode 100755 regress/scripts/copy-fifo-confs create mode 100755 regress/scripts/copy-migration-confs create mode 100755 regress/scripts/copy-tape-confs create mode 100755 regress/scripts/copy-test-confs create mode 100755 regress/scripts/copy-testa-confs create mode 100755 regress/scripts/copy-tls-confs create mode 100755 regress/scripts/copy-win32-confs create mode 100644 regress/scripts/crypto-bacula-fd.conf.in create mode 100644 regress/scripts/cryptokeypair.pem create mode 100755 regress/scripts/do_sed create mode 100644 regress/scripts/exclude-dev-test create mode 100644 regress/scripts/exclude-etc-test create mode 100644 regress/scripts/exclude-lib-test create mode 100644 regress/scripts/flist create mode 100644 regress/scripts/freebsd_tape_options create mode 100644 regress/scripts/functions create mode 100644 regress/scripts/linux_osst_tape_options create mode 100644 regress/scripts/linux_tape_options create mode 100644 regress/scripts/master2048.cert create mode 100644 regress/scripts/multi-client-bacula-dir.conf.in create mode 100644 regress/scripts/new-test-bacula-dir.conf.in create mode 100755 regress/scripts/prepare-two-disks create mode 100755 regress/scripts/prepare-two-tapes.in create mode 100755 regress/scripts/regress-config create mode 100755 regress/scripts/setup create mode 100644 regress/scripts/test-bacula-dir.conf.in create mode 100644 regress/scripts/test-bacula-fd.conf.in create mode 100644 regress/scripts/test-bacula-sd.conf.in create mode 100644 regress/scripts/test-console.conf.in create mode 100644 regress/scripts/testa-bacula-dir.conf.in create mode 100644 regress/scripts/testb-bacula-dir.conf.in create mode 100644 regress/scripts/tls-CA.pem create mode 100644 regress/scripts/tls-bacula-dir.conf.in create mode 100644 regress/scripts/tls-bacula-fd.conf.in create mode 100644 regress/scripts/tls-bacula-sd.conf.in create mode 100644 regress/scripts/tls-cert.pem create mode 100644 regress/scripts/win32-bacula-dir-tape.conf.in create mode 100644 regress/scripts/win32-bacula-fd.conf.in create mode 100644 regress/scripts/win32-bacula-sd-tape.conf.in create mode 100755 regress/starttime create mode 100755 regress/tape create mode 100755 regress/tests/2drive-3pool-test create mode 100755 regress/tests/2drive-concurrent-test create mode 100755 regress/tests/2drive-incremental-2disk create mode 100755 regress/tests/2drive-incremental-2tape create mode 100755 regress/tests/ansi-label-tape create mode 100755 regress/tests/auto-label-test create mode 100755 regress/tests/backup-bacula-tape create mode 100755 regress/tests/backup-bacula-test create mode 100755 regress/tests/backup-to-null create mode 100755 regress/tests/backup-win32-tape create mode 100755 regress/tests/bextract-test create mode 100755 regress/tests/big-vol-test create mode 100755 regress/tests/bscan-fast-tape create mode 100755 regress/tests/bscan-tape create mode 100755 regress/tests/bscan-test create mode 100755 regress/tests/bsr-opt-test create mode 100755 regress/tests/btape-fill-full-tape create mode 100755 regress/tests/btape-fill-tape create mode 100755 regress/tests/bug-897 create mode 100755 regress/tests/bug-fatal-test create mode 100755 regress/tests/compress-encrypt-test create mode 100755 regress/tests/compressed-test create mode 100755 regress/tests/concurrent-jobs-test create mode 100755 regress/tests/data-encrypt-test create mode 100755 regress/tests/dev-test-root create mode 100755 regress/tests/differential-test create mode 100755 regress/tests/eighty-simultaneous-jobs-tape create mode 100755 regress/tests/encrypt-bug-test create mode 100755 regress/tests/eot-fail-tape create mode 100755 regress/tests/errors-test create mode 100755 regress/tests/etc-test-root create mode 100755 regress/tests/fast-two-pool-test create mode 100755 regress/tests/fifo-test create mode 100755 regress/tests/fixed-block-size-tape create mode 100755 regress/tests/four-concurrent-jobs-tape create mode 100755 regress/tests/four-concurrent-jobs-test create mode 100755 regress/tests/four-jobs-tape create mode 100755 regress/tests/four-jobs-test create mode 100755 regress/tests/gigaslam-sparse-test create mode 100755 regress/tests/hardlink-test create mode 100755 regress/tests/incremental-2disk create mode 100755 regress/tests/incremental-2media create mode 100755 regress/tests/incremental-2media-tape create mode 100755 regress/tests/incremental-2tape create mode 100755 regress/tests/incremental-tape create mode 100755 regress/tests/incremental-test create mode 100755 regress/tests/lib-tape-root create mode 100755 regress/tests/lib-test-root create mode 100755 regress/tests/maxtime-test create mode 100755 regress/tests/maxvol-test create mode 100755 regress/tests/memory-bug-tape create mode 100755 regress/tests/migration-job-test create mode 100755 regress/tests/migration-jobspan-test create mode 100755 regress/tests/migration-occupancy-test create mode 100755 regress/tests/migration-time-test create mode 100755 regress/tests/migration-volume-test create mode 100755 regress/tests/multi-client-test create mode 100755 regress/tests/query-test create mode 100755 regress/tests/recycle-test create mode 100755 regress/tests/regexwhere-test create mode 100755 regress/tests/relabel-tape create mode 100755 regress/tests/restore-by-file-tape create mode 100755 regress/tests/restore-by-file-test create mode 100755 regress/tests/restore-disk-seek-test create mode 100755 regress/tests/restore-seek-tape create mode 100755 regress/tests/restore2-by-file-test create mode 100755 regress/tests/runscript-test create mode 100755 regress/tests/scratch-pool-test create mode 100755 regress/tests/six-vol-test create mode 100755 regress/tests/small-file-size-tape create mode 100755 regress/tests/span-vol-test create mode 100755 regress/tests/sparse-compressed-test create mode 100755 regress/tests/sparse-encrypt-test create mode 100755 regress/tests/sparse-test create mode 100755 regress/tests/test0 create mode 100755 regress/tests/three-pool-recycle-test create mode 100755 regress/tests/three-pool-test create mode 100755 regress/tests/tls-test create mode 100755 regress/tests/truncate-bug-tape create mode 100755 regress/tests/two-jobs-test create mode 100755 regress/tests/two-pool-tape create mode 100755 regress/tests/two-pool-test create mode 100755 regress/tests/two-vol-test create mode 100755 regress/tests/two-volume-tape create mode 100755 regress/tests/two-volume-test create mode 100755 regress/tests/usr-tape-root create mode 100755 regress/tests/verify-cat-test create mode 100755 regress/tests/verify-vol-tape create mode 100755 regress/tests/verify-vol-test create mode 100755 regress/tests/weird-files-test create mode 100755 regress/tests/weird-files2-test create mode 100755 regress/tests/win32-backup-tape create mode 100755 regress/tests/win32-to-linux-tape create mode 100644 regress/weird-files.tar.gz create mode 100644 regress/win32/all-non-root-2tape-tests.cmd create mode 100644 regress/win32/all-non-root-tape-tests.cmd create mode 100644 regress/win32/all-non-root-tests.cmd create mode 100644 regress/win32/all-root-tests.cmd create mode 100644 regress/win32/all-tape-and-file-tests.cmd create mode 100644 regress/win32/all-tests.cmd create mode 100644 regress/win32/config.cmd create mode 100644 regress/win32/make.cmd create mode 100644 regress/win32/prototype.conf create mode 100644 regress/win32/scripts/bacula-dir-migration.conf.in create mode 100644 regress/win32/scripts/bacula-dir-tape.conf.in create mode 100644 regress/win32/scripts/bacula-dir-win32-tape.conf.in create mode 100644 regress/win32/scripts/bacula-dir.conf.testrunscript.in create mode 100644 regress/win32/scripts/bacula-sd-2disk-drive.conf.in create mode 100644 regress/win32/scripts/bacula-sd-2disk.conf.in create mode 100644 regress/win32/scripts/bacula-sd-2drive.conf.in create mode 100644 regress/win32/scripts/bacula-sd-2tape.conf.in create mode 100644 regress/win32/scripts/bacula-sd-migration.conf.in create mode 100644 regress/win32/scripts/bacula-sd-tape.conf.in create mode 100644 regress/win32/scripts/bacula-sd.conf.in create mode 100644 regress/win32/scripts/bacula.cmd create mode 100644 regress/win32/scripts/check_for_zombie_jobs.bscr create mode 100644 regress/win32/scripts/check_for_zombie_jobs.cmd create mode 100644 regress/win32/scripts/cleanup-2drive.cmd.in create mode 100644 regress/win32/scripts/cleanup-2tape.cmd.in create mode 100644 regress/win32/scripts/cleanup-tape.cmd.in create mode 100644 regress/win32/scripts/cleanup.cmd create mode 100644 regress/win32/scripts/copy-2disk-confs.cmd create mode 100644 regress/win32/scripts/copy-2disk-drive-confs.cmd create mode 100644 regress/win32/scripts/copy-2drive-confs.cmd create mode 100644 regress/win32/scripts/copy-2tape-confs.cmd create mode 100644 regress/win32/scripts/copy-confs.cmd create mode 100644 regress/win32/scripts/copy-crypto-confs.cmd create mode 100644 regress/win32/scripts/copy-migration-confs.cmd create mode 100644 regress/win32/scripts/copy-tape-confs.cmd create mode 100644 regress/win32/scripts/copy-test-confs.cmd create mode 100644 regress/win32/scripts/copy-testa-confs.cmd create mode 100644 regress/win32/scripts/copy-win32-confs.cmd create mode 100644 regress/win32/scripts/crypto-bacula-fd.conf.in create mode 100644 regress/win32/scripts/cryptokeypair.pem create mode 100644 regress/win32/scripts/disk-changer.cmd create mode 100644 regress/win32/scripts/do_sed.cmd create mode 100644 regress/win32/scripts/exclude-dev-test create mode 100644 regress/win32/scripts/exclude-etc-test create mode 100644 regress/win32/scripts/exclude-lib-test create mode 100644 regress/win32/scripts/flist create mode 100644 regress/win32/scripts/functions.cmd create mode 100644 regress/win32/scripts/install_bacula.cmd create mode 100644 regress/win32/scripts/new-test-bacula-dir.conf.in create mode 100644 regress/win32/scripts/prepare-two-disks.cmd create mode 100644 regress/win32/scripts/prepare-two-tapes.cmd.in create mode 100644 regress/win32/scripts/setup.cmd create mode 100644 regress/win32/scripts/test-bacula-dir.conf.in create mode 100644 regress/win32/scripts/test-bacula-fd.conf.in create mode 100644 regress/win32/scripts/test-bacula-sd.conf.in create mode 100644 regress/win32/scripts/test-console.conf.in create mode 100644 regress/win32/scripts/testa-bacula-dir.conf.in create mode 100644 regress/win32/scripts/win32-bacula-dir-tape.conf.in create mode 100644 regress/win32/scripts/win32_tape_options create mode 100644 regress/win32/tests/2drive-incremental-2disk.1.bscr create mode 100644 regress/win32/tests/2drive-incremental-2disk.2.bscr create mode 100644 regress/win32/tests/2drive-incremental-2disk.cmd create mode 100644 regress/win32/tests/2drive-incremental-2tape create mode 100644 regress/win32/tests/auto-label-test.bscr create mode 100644 regress/win32/tests/auto-label-test.cmd create mode 100644 regress/win32/tests/backup-bacula-tape create mode 100644 regress/win32/tests/backup-bacula-test.bscr create mode 100644 regress/win32/tests/backup-bacula-test.cmd create mode 100644 regress/win32/tests/backup-win32-tape create mode 100644 regress/win32/tests/bextract-test.bscr create mode 100644 regress/win32/tests/bextract-test.cmd create mode 100644 regress/win32/tests/bscan-fast-tape create mode 100644 regress/win32/tests/bscan-tape create mode 100644 regress/win32/tests/bscan-test.1.bscr create mode 100644 regress/win32/tests/bscan-test.2.bscr create mode 100644 regress/win32/tests/bscan-test.cmd create mode 100644 regress/win32/tests/bsr-opt-test.bscr create mode 100644 regress/win32/tests/bsr-opt-test.cmd create mode 100644 regress/win32/tests/btape-fill-full-tape create mode 100644 regress/win32/tests/btape-fill-tape create mode 100644 regress/win32/tests/compressed-test.bscr create mode 100644 regress/win32/tests/compressed-test.cmd create mode 100644 regress/win32/tests/concurrent-jobs-test.bscr create mode 100644 regress/win32/tests/concurrent-jobs-test.cmd create mode 100644 regress/win32/tests/dev-test-root create mode 100644 regress/win32/tests/differential-test.1.bscr create mode 100644 regress/win32/tests/differential-test.2.bscr create mode 100644 regress/win32/tests/differential-test.3.bscr create mode 100644 regress/win32/tests/differential-test.cmd create mode 100644 regress/win32/tests/eot-fail-tape create mode 100644 regress/win32/tests/etc-test-root create mode 100644 regress/win32/tests/fixed-block-size-tape create mode 100644 regress/win32/tests/four-concurrent-jobs-tape create mode 100644 regress/win32/tests/four-concurrent-jobs-test.bscr create mode 100644 regress/win32/tests/four-concurrent-jobs-test.cmd create mode 100644 regress/win32/tests/four-jobs-tape create mode 100644 regress/win32/tests/four-jobs-test.1.bscr create mode 100644 regress/win32/tests/four-jobs-test.2.bscr create mode 100644 regress/win32/tests/four-jobs-test.3.bscr create mode 100644 regress/win32/tests/four-jobs-test.4.bscr create mode 100644 regress/win32/tests/four-jobs-test.5.bscr create mode 100644 regress/win32/tests/four-jobs-test.cmd create mode 100644 regress/win32/tests/hardlink-test create mode 100644 regress/win32/tests/incremental-2disk.1.bscr create mode 100644 regress/win32/tests/incremental-2disk.2.bscr create mode 100644 regress/win32/tests/incremental-2disk.cmd create mode 100644 regress/win32/tests/incremental-2tape.1.bscr create mode 100644 regress/win32/tests/incremental-2tape.2.bscr create mode 100644 regress/win32/tests/incremental-2tape.cmd create mode 100644 regress/win32/tests/incremental-tape create mode 100644 regress/win32/tests/incremental-test.1.bscr create mode 100644 regress/win32/tests/incremental-test.2.bscr create mode 100644 regress/win32/tests/incremental-test.3.bscr create mode 100644 regress/win32/tests/incremental-test.4.bscr create mode 100644 regress/win32/tests/incremental-test.5.bscr create mode 100644 regress/win32/tests/incremental-test.cmd create mode 100644 regress/win32/tests/lib-tape-root create mode 100644 regress/win32/tests/lib-test-root create mode 100644 regress/win32/tests/migration-job-test.cmd create mode 100644 regress/win32/tests/migration-jobspan-test.cmd create mode 100644 regress/win32/tests/migration-occupancy-test.cmd create mode 100644 regress/win32/tests/migration-time-test.cmd create mode 100644 regress/win32/tests/migration-volume-test.cmd create mode 100644 regress/win32/tests/query-test.1.bscr create mode 100644 regress/win32/tests/query-test.2.bscr create mode 100644 regress/win32/tests/query-test.3.bscr create mode 100644 regress/win32/tests/query-test.cmd create mode 100644 regress/win32/tests/recycle-test.bscr create mode 100644 regress/win32/tests/recycle-test.cmd create mode 100644 regress/win32/tests/relabel-tape create mode 100644 regress/win32/tests/restore-by-file-tape create mode 100644 regress/win32/tests/restore-by-file-test.bscr create mode 100644 regress/win32/tests/restore-by-file-test.cmd create mode 100644 regress/win32/tests/restore-disk-seek-test.bscr create mode 100644 regress/win32/tests/restore-disk-seek-test.cmd create mode 100644 regress/win32/tests/restore2-by-file-test.bscr create mode 100644 regress/win32/tests/restore2-by-file-test.cmd create mode 100644 regress/win32/tests/runscript-test create mode 100644 regress/win32/tests/scratch-pool-test.bscr create mode 100644 regress/win32/tests/scratch-pool-test.cmd create mode 100644 regress/win32/tests/six-vol-test.bscr create mode 100644 regress/win32/tests/six-vol-test.cmd create mode 100644 regress/win32/tests/small-file-size-tape create mode 100644 regress/win32/tests/span-vol-test.bscr create mode 100644 regress/win32/tests/span-vol-test.cmd create mode 100644 regress/win32/tests/sparse-compressed-test.bscr create mode 100644 regress/win32/tests/sparse-compressed-test.cmd create mode 100644 regress/win32/tests/sparse-test.bscr create mode 100644 regress/win32/tests/sparse-test.cmd create mode 100644 regress/win32/tests/test0.cmd create mode 100644 regress/win32/tests/truncate-bug-tape create mode 100644 regress/win32/tests/two-jobs-test.1.bscr create mode 100644 regress/win32/tests/two-jobs-test.2.bscr create mode 100644 regress/win32/tests/two-jobs-test.cmd create mode 100644 regress/win32/tests/two-pool-tape create mode 100644 regress/win32/tests/two-pool-test.bscr create mode 100644 regress/win32/tests/two-pool-test.cmd create mode 100644 regress/win32/tests/two-vol-test.bscr create mode 100644 regress/win32/tests/two-vol-test.cmd create mode 100644 regress/win32/tests/two-volume-tape.1.bscr create mode 100644 regress/win32/tests/two-volume-tape.2.bscr create mode 100644 regress/win32/tests/two-volume-tape.cmd create mode 100644 regress/win32/tests/two-volume-test.bscr create mode 100644 regress/win32/tests/two-volume-test.cmd create mode 100644 regress/win32/tests/usr-tape-root create mode 100644 regress/win32/tests/verify-vol-tape create mode 100644 regress/win32/tests/verify-vol-test.bscr create mode 100644 regress/win32/tests/verify-vol-test.cmd create mode 100644 regress/win32/tests/weird-files-test create mode 100644 regress/win32/tests/weird-files2-test create mode 100644 regress/win32/tests/win32-backup-tape create mode 100644 regress/win32/tests/win32-to-linux-tape diff --git a/regress/Makefile b/regress/Makefile new file mode 100644 index 0000000000..c7e575c37c --- /dev/null +++ b/regress/Makefile @@ -0,0 +1,68 @@ +# +# Makefile for Bacula regression testing +# +# Before running, you must create a file named config containing +# the configuration parameters. Create it by doing: +# +# cp prototype.conf config +# +# Then edit config and set the value for what are appropriate for you. +# + +first_rule: all + +all: + +setup: bacula sed + +# +# Some machines cannot handle the sticky bit and other garbage that +# is in weird-files, so we load and run it only on Linux machines. +# +bacula: all + @rm -rf bin build weird-files tmp + @rm -f w.tar.gz w.tar + @cp weird-files.tar.gz w.tar.gz + @-gunzip w.tar.gz + @-tar xf w.tar + @rm -f w.tar.gz w.tar + @rm -rf tmp working + mkdir tmp working + echo "Doing: scripts/setup" + scripts/setup + +sed: + echo "Doing: scripts/do_sed" + scripts/do_sed + +# Run all non-root userid tests +test: + ./all-non-root-tests + +# run all file and tape tests +full_test: + ./all-tape-and-file-tests + +# These tests require you to run as root +root_test: + ./all-root-tests + +clean: + scripts/cleanup + rm -f tmp/file-list + rm -fr tmp/* working/* + rm -f test.out + rm -f diff + rm -f 1 2 3 scripts/1 scripts/2 scripts/3 tests/1 tests/2 tests/3 + find . -name .#* -exec rm -rf {} \; + +# Reset our userid after running as root +reset: + chown -R ${USER}:${USER} . tmp working + scripts/cleanup + rm -f tmp/* working/* + +distclean: clean + rm -rf bin build weird-files weird-files weird-files2 tmp working + rm -f scripts/*.conf + diff --git a/regress/README b/regress/README new file mode 100644 index 0000000000..d289c630a3 --- /dev/null +++ b/regress/README @@ -0,0 +1,204 @@ + Bacula Regression + Kern Sibbald + +This is Bacula's regression script directory. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +Warning!!!! Make sure not to run it on the same system +with your production Catalog because the tables will all +be cleared. You can run it on the your production system +if you use a different database. E.g. if your production +system uses MySQL, you can use SQLite here. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +To set it up, create your personal configuration file, by +copying prototype.conf to config or simply editing prototype.conf +directly then copying it to the file config. + +You must end up with a file named config in the main regress +directory that has all the specifications that correspond to +your system. + +If you are using SQLite, make sure that depkgs is pre-built if it +isn't already: (cd your-depkgs; make sqlite). + +Note, if you use any database other than SQLite, be sure it is not +your production database because Bacula will delete all the tables +and recreate them. With SQLite, a new different database is created, +so it will not affect your production system. + +Using the .conf file, you can now select between any Catalog type: +SQLite, SQLite3, MySQL, or PostgreSQL. Be aware, however, if you +use an installed database on a production server, running these +tests will delete all the tables !!!!!!!!!!!!!!!!!! I run my +tests on a non-production machine, and in addition, I normally use +SQLite as the database, while my production uses MySQL. + +Then do: + + make setup + +You run the above one time. This will build a Makefile from +Makefile.in and your xxx.conf file, copy the Bacula source, +configure, build it, and configure all the Bacula scripts +and conf files. If you change your source, you will need to +redo this command. + +Then you can run any of the tests in the tests subdirectory. +Each test whose name ends in -root requires you to be root for +a resonable run. Each test is totally independent of any other +test. Aside from the required "make setup", each test is totally +self-initalizing and should clean up after itself. + +All the tests expect you to execute them from the main regress +directory! + +You can run all the disk based tests by doing: + + ./do_file + +The disk based tests are totally separate from any production +system, provided you have configured the database appropriately +as noted above. + +You can run all the disk and most of the tape tests by doing: + + ./do_all + +======== Important !!! ============ +When running the tape tests, Bacula will write on any tape that +is in the tape drive that you have configured. If it is a production +Bacula tape, it will be destroyed. If you have configured an Autochanger, +Bacula will write on the tapes in slots 1 and 2 thus destroying any +information on those tapes, even if they are Bacula production tapes. +=================================== + +Each of the above calls one or more scripts. By looking at the +scripts available in this directory, you can see that there are a number +of options for running tests. + +You can run them individually as: + + tests/two-jobs-test + +or all non-root tests (my normal testing under my account) + + ./all-non-root-tests + +or all tests (I only run these before a production release): + + su + ./all-tests + + +after running the root tests, while still root, it is a good idea +to do: + + make reset + +this cleans up any files that may be created with root permissions. + +If you want to add more tests, do so by putting the shell script +in the tests subdirectory. Be careful when adding (or better not) +new clients, pools, and such to the test-bacula-dir.conf.in file +as it may invalidate a good number of tests, which respond to +questions by answering with a number (i.e. the order of the selection +list is known). It might be better to add your own testb-bacula... +configuration file. + +To avoid re-doing a make setup if you have made a change to the +conf files, and you do not need a new copy of the source, you can simply do: + + make sed + +Debugging failed tests: +Prior versions required editing the tests/xxxx and changing a debug flag. +However, that has been replaced by two environment variables: + + REGRESS_DEBUG + REGRESS_WAIT + +If you define REGRESS_DEBUG, e.g. + + REGRESS_DEBUG=1 + export REGRESS_DEBUG + +then run a test, it will display the job and debug output. + +If you define REGRESS_WAIT, the script will stop and request: + +Start Bacula under debugger and enter anything when ready ... + +At this point, you can start any of the daemons under the debugger, +then answer the message by entering any character. The script will +then continue. For any daemon or daemons that you have manually started, +you will see an error message when the script attempts to run a second +copy, but those messages can be ignored. This makes it reasonably easy +to run any component or components under the debugger if necessary. + +Explicit example: + +In shell window 1. + +cd regress +export REGRESS_DEBUG=1 +export REGRESS_WAIT=1 +tests/name-of-script-test +(wait until it tells you to start the debugger) + +In shell window 2 + +cd regress/bin +gdb bacula-xx (where xx is the component you want to debug). +(possibly set a break point -- normally not) +run -s -f +(wait for the output to stop) + +In shell window 1 +(enter any character or simply a return) +(ignore the error message it prints complaining that the daemon +you are debugging is already running, which is in fact the case). + + +That is all there is to it. The debugger window will get some +output and will stop waiting for input if anything goes wrong +like a seg fault. At that point, you can enter commands. + +The procedure avoids modifying the test scripts and trying to +find pids and the such. If you want less debug output when +debugging, don't set REGRESS_DEBUG=1. + +=== + +Also, if you run from time to time on a computer that is not connected +to the network, please be sure that "hostname" is set to "localhost", +otherwise, your tests may fail because the hostname used by Bacula's +./configure cannot be properly resolved. + +Anyway, you can debug where it is happening in the source code using the +following example. For example, here I get the following backtrace: + +======= Backtrace: ========= +/lib/libc.so.6[0xb7b9d6e1] +/lib/libc.so.6(cfree+0x89)[0xb7b9ed79] +/home/kern/bacula/regress/bin/bacula-fd[0x8082ae5] +/home/kern/bacula/regress/bin/bacula-fd[0x8082d58] +/home/kern/bacula/regress/bin/bacula-fd[0x80838ac] +/home/kern/bacula/regress/bin/bacula-fd[0x807aa3f] +/home/kern/bacula/regress/bin/bacula-fd[0x807ac29] +/home/kern/bacula/regress/bin/bacula-fd[0x804d188] +/lib/libc.so.6(__libc_start_main+0xdc)[0xb7b4ef9c] +/home/kern/bacula/regress/bin/bacula-fd[0x804cd21] + +Now to convert this into something more meaningful, kill off any hung Bacula +processes. Note the one that was running -- above you see that it was +bacula-fd, then bring the same binary up in the debugger. Then start at the +first bacula-fd line, and feed the hex number to gdb as follows: + +info symbol 0x8082ae5 +free_addresses(dlist*) + 53 in section .text + +info symbol 0x8082d58 +add_address(dlist**, IPADDR::i_type, unsigned short, int, char const*, char +const*, char**) + 568 in section .text diff --git a/regress/README.mingw32 b/regress/README.mingw32 new file mode 100644 index 0000000000..14e6df0087 --- /dev/null +++ b/regress/README.mingw32 @@ -0,0 +1,44 @@ + Re: [Bacula-devel] Win32 Regression Scripts +From: "Michael Short" (Securenets.us) + To: bacula-devel@lists.sourceforge.net +Date: 30 August 2007 04:09:00 + + +Hey guys, I've made a bit of progress on the win32 regression scripts. + +In order to use the win32 bacula regression scripts, it is important to have +some unix tools (such as sed, grep, and diff). To make things simple, I +downloaded UnxUtils from http://sourceforge.net/projects/unxutils + +Extract this somewhere on your hdd and add the the files in usr\local\wbin to +c:\regress\tools and then add c:\regress\tools to your {$PATH} on your windows +box. If you also want to make use of the shell (from unxutils) you may want +to add the ./bin directory as well (or just copy the sh.exe file to +usr\local\wbin). + +Now that you have a working toolset (with sed) we can continue setting up +regression tools. Compile the Ming32 version of bacula (from linux) and then +copy the entire source directory of bacula (with binaries) to somewhere on +your windows hdd (say... C:\bacula :P). + +Copy a version of the regression scripts ( from regress/win32 ) to your +windows hdd (hmm... C:\regress ). Edit the prototype.conf file and set your +bacula source directory ( C:/bacula ) and your e-mail address (!!). Run +"config prototype.conf" from within the regression directory to configure +the regression scripts. + +Edit regress\scripts\install_bacula.cmd and replace "COPY bin\sqlite.dll +bin\bacula_cats.dll > nul" and replace "cats_sqlite.dll" with +"cats_sqlite3.dll". ( FixMe ) + +>From the regress directory, run "make setup" and the script should copy the +binaries from the bacula sources and create a local bacula testing platform. +----------- + +After the "make setup" all the configuration files are blank, so you must +fix that before running the scripts. + +With the above, most of the regressions scripts seem to function flawlessly. + +[KES] The ones that fail have probably been modified on the Unix side + after the port was done, so they may need some minor updates. diff --git a/regress/all-non-root-2tape-tests b/regress/all-non-root-2tape-tests new file mode 100755 index 0000000000..9491417f1b --- /dev/null +++ b/regress/all-non-root-2tape-tests @@ -0,0 +1,10 @@ +#!/bin/sh +# +# Run all tape tests +# +echo "Start two tape tests" +echo "Start two tape tests" >>test.out +nice tests/two-volume-tape +nice tests/incremental-2tape +echo "End two tape tests" +echo "End two tape tests" >>test.out diff --git a/regress/all-non-root-tape-tests b/regress/all-non-root-tape-tests new file mode 100755 index 0000000000..708aa8389d --- /dev/null +++ b/regress/all-non-root-tape-tests @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Run all tape tests +# +. ./config.out +if test ! x$AUTOCHANGER = x/dev/null ; then + mtx -f $AUTOCHANGER load 1 >/dev/null &2>/dev/null +fi +echo " " +echo " " >>test.out +echo "Start all non-root tape tests" +echo "Start all non-root tape tests" >>test.out +nice tests/ansi-label-tape +nice tests/backup-bacula-tape +nice tests/btape-fill-tape +nice tests/fixed-block-size-tape +nice tests/four-concurrent-jobs-tape +nice tests/four-jobs-tape +nice tests/incremental-tape +nice tests/relabel-tape +nice tests/restore-by-file-tape +nice tests/small-file-size-tape +nice tests/truncate-bug-tape +nice tests/two-pool-tape +nice tests/2drive-incremental-2tape +nice tests/bscan-tape +nice tests/verify-vol-tape +echo "End all non-root tape tests" +echo "End all non-root tape tests" >>test.out diff --git a/regress/all-non-root-tests b/regress/all-non-root-tests new file mode 100755 index 0000000000..831e232728 --- /dev/null +++ b/regress/all-non-root-tests @@ -0,0 +1,76 @@ +#!/bin/sh +# +# Run all tests +# +echo " " +echo " " >>test.out +echo "Start non-root disk tests" +echo "Start non-root disk tests" >>test.out +nice tests/auto-label-test +nice tests/backup-bacula-test +nice tests/bextract-test +nice tests/big-vol-test +nice tests/bscan-test +nice tests/bsr-opt-test +nice tests/compressed-test +nice tests/compress-encrypt-test +nice tests/concurrent-jobs-test +nice tests/data-encrypt-test +nice tests/encrypt-bug-test +nice tests/fifo-test +nice tests/backup-to-null +nice tests/regexwhere-test +# The following two can uses *lots* of disk space +# so they are normally turned off, but if you have +# at least two GB free, you can run them +#nice tests/sparse-encrypt-test +#nice tests/gigaslam-sparse-test +nice tests/differential-test +nice tests/four-concurrent-jobs-test +nice tests/four-jobs-test +nice tests/incremental-test +nice tests/query-test +nice tests/recycle-test +nice tests/restore2-by-file-test +nice tests/restore-by-file-test +nice tests/restore-disk-seek-test +#nice tests/runscript-test +nice tests/six-vol-test +nice tests/span-vol-test +nice tests/maxvol-test +nice tests/sparse-compressed-test +nice tests/sparse-test +nice tests/two-jobs-test +nice tests/two-vol-test +nice tests/verify-cat-test +nice tests/verify-vol-test +nice tests/weird-files2-test +nice tests/weird-files-test +nice tests/migration-job-test +nice tests/migration-jobspan-test +nice tests/migration-volume-test +nice tests/migration-time-test +nice tests/hardlink-test +nice tests/tls-test +echo "End non-root disk tests" +echo "End non-root disk tests" >>test.out + +# +# The following are Virtual Disk Autochanger tests +echo " " +echo " " >>test.out +echo "Start non-root virtual disk autochanger tests" +echo "Start non-root virtual disk autochangertests" >>test.out +#nice tests/three-pool-recycle-test +nice tests/two-pool-test +nice tests/fast-two-pool-test +nice tests/two-volume-test +nice tests/incremental-2disk +nice tests/2drive-incremental-2disk +nice tests/scratch-pool-test +nice tests/2drive-concurrent-test +nice tests/incremental-2media +nice tests/three-pool-test +nice tests/2drive-3pool-test +echo "End non-root virtual disk autochanger tests" +echo "End non-root virtual disk autochangertests" >>test.out diff --git a/regress/all-root-tests b/regress/all-root-tests new file mode 100755 index 0000000000..1ba54d9f4a --- /dev/null +++ b/regress/all-root-tests @@ -0,0 +1,14 @@ +#!/bin/sh +# +# Run all root tests +# +echo " " +echo " " >>test.out +echo "Start root tests" +echo "Start root tests" >>test.out +tests/dev-test-root +tests/etc-test-root +tests/lib-test-root +tests/usr-tape-root +echo "End root tests" +echo "End root tests" >>test.out diff --git a/regress/all-tape-and-file-tests b/regress/all-tape-and-file-tests new file mode 100755 index 0000000000..9bc3e7676c --- /dev/null +++ b/regress/all-tape-and-file-tests @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Run all tests +# +./all-non-root-tests +./all-non-root-tape-tests diff --git a/regress/all-tests b/regress/all-tests new file mode 100755 index 0000000000..e3dc688c87 --- /dev/null +++ b/regress/all-tests @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Run all tests +# +./all-non-root-tests +./all-root-tests diff --git a/regress/do_all b/regress/do_all new file mode 100755 index 0000000000..5dfc97fad5 --- /dev/null +++ b/regress/do_all @@ -0,0 +1,3 @@ +#!/bin/sh +nice make setup +./do_all_tests diff --git a/regress/do_all_tapes b/regress/do_all_tapes new file mode 100755 index 0000000000..dd07d2ec99 --- /dev/null +++ b/regress/do_all_tapes @@ -0,0 +1,3 @@ +#!/bin/sh +make setup +./all-non-root-tape-tests diff --git a/regress/do_all_tests b/regress/do_all_tests new file mode 100755 index 0000000000..76d4bc3c71 --- /dev/null +++ b/regress/do_all_tests @@ -0,0 +1,20 @@ +#!/bin/sh +./starttime +if [ ! -f bin/tape_options ] ; then + touch bin/tape_options +fi +echo " " >test.out +cat build/config.out >>test.out +echo " " >>test.out +echo "Test results" >>test.out +echo " " >>test.out +./starttime +nice ./all-non-root-tests +nice ./all-non-root-tape-tests +nice ./all-non-root-2tape-tests +echo " " +echo "End do_all tests" +echo "End do_all tests" >>test.out +scripts/cleanup +cat test.out +./endtime diff --git a/regress/do_file b/regress/do_file new file mode 100755 index 0000000000..0ac4aa8bf3 --- /dev/null +++ b/regress/do_file @@ -0,0 +1,16 @@ +#!/bin/sh +# /home/kern/bacula/bin/startmysql +nice make setup +echo " " >test.out +cat build/config.out >>test.out +echo " " >>test.out +echo "Test results" >>test.out +echo " " >>test.out +./starttime +nice ./all-non-root-tests +echo " " +echo "End do_file tests" +echo "End do_file tests" >>test.out +scripts/cleanup +cat test.out +./endtime diff --git a/regress/encrypt-bug.jpg b/regress/encrypt-bug.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18825f97ba7a8e52c41d68b270f15b56aff00ab6 GIT binary patch literal 327681 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℘VO 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 z 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 literal 0 HcmV?d00001 diff --git a/regress/encrypt-bug.txt b/regress/encrypt-bug.txt new file mode 100644 index 0000000000..6a68dd8c7b --- /dev/null +++ b/regress/encrypt-bug.txt @@ -0,0 +1,49 @@ +-----BEGIN PGP MESSAGE----- +Charset: ISO-8859-1 +Version: GnuPG v1.4.2 (FreeBSD) +Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org + +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 ++spDOiRKBUg= +=W5Nc +-----END PGP MESSAGE----- \ No newline at end of file diff --git a/regress/encrypt-bug2.txt b/regress/encrypt-bug2.txt new file mode 100644 index 0000000000..ef110a6c95 --- /dev/null +++ b/regress/encrypt-bug2.txt @@ -0,0 +1,75 @@ +From: "Michel Meyers" +To: "bacula-users" +Subject: [Bacula-users] Script for pushing new clients to Windows boxes +Date: Mon, 2 Feb 2004 16:10:48 +0100 + +Hello, + +Some of you may remember my document on how to remotely push a Win32 bacula +client onto a WinNT/2k/XP box. Well, I've written a script to do it for me +and thought I'd share it with you: +- ---------------------------------------------------------------- +#!/bin/bash +# +# Remote Win32 client upgrade script +# written by Michel Meyers (last update 2006-09-25 11:34) +# +# WARNING: Make sure that no bacula-fd.conf exists in the source directory! +# You will destroy/overwrite all your client's configs if you don't +# be careful with this. +# +# The upgrade function does the following: +# - Shutdown Bacula service on remote machine +# - Wait 30 seconds (to allow proper shutdown) +# - Mount C: drive of remote box +# - Copy new client to remote machine +# - Unmount C; +# - Startup the new Bacula service +# +# To upgrade a machine append the following at the bottom of this file: +# +# SERVERNAME= +# USERNAME= +# PASSWORD= +# upgrade + +upgrade() { +net rpc -S $SERVERNAME -U $USERNAME%"$PASSWORD" service stop bacula +sleep 30 +smbmount //$SERVERNAME/c$ /mnt -o username=$USERNAME,password="$PASSWORD" +cp /home/michel/winbacula/bin/* /mnt/bacula/bin +umount /mnt +net rpc -S $SERVERNAME -U $USERNAME%"$PASSWORD" service start bacula +} + +SERVERNAME=xerxes +USERNAME=administrator +PASSWORD=secret +upgrade + +SERVERNAME=shodan +USERNAME=teh_one +PASSWORD="" +upgrade +- ---------------------------------------------------------------- + +It should be pretty self-explanatory. I'm not good at shell programming and +I don't know whether there's any notion of arrays or 'for' loops that could +make it cleaner so I simply wrote a function which references some variables +and then call that repeatedly (once per machine). You can of course change +the values according to your system and liking (if 30 secs seem to much for +you, just reduce the value after sleep, make sure to check on the paths and +mountpoint /mnt may not be usable on your system, ...) + +Note: The requirements are the same as described in my other document +(Samba-TNG clients among others, otherwise you'll be missing rpcclient). + +Update 2006-09-25: Samba-TNG is no longer required, the 'net' command from +Samba 3 works for starting and stopping services. Paths may need to be +updated with quotation marks as the new Bacula Win32 Installer no longer +installs into C:\bacula but into 'C:\Program Files\bacula' (on English +Windows versions). + + +Enjoy! + diff --git a/regress/endtime b/regress/endtime new file mode 100755 index 0000000000..0502fec376 --- /dev/null +++ b/regress/endtime @@ -0,0 +1,12 @@ +#!/usr/bin/env python +from time import time as now + +t = now() +fn = open('time.out', 'r') +s = fn.readline() +fn.close() +diff = t - float(s) +h = int(diff / 3600) +m = int((diff - h * 3600) / 60) +sec = diff - h * 3600 - m * 60 +print 'Total time = %d:%02d:%02d or %d secs' % (h, m, sec, t - float(s)) diff --git a/regress/file b/regress/file new file mode 100755 index 0000000000..8f2089051b --- /dev/null +++ b/regress/file @@ -0,0 +1,2 @@ +#!/bin/sh +./all-non-root-tests diff --git a/regress/freebsd.conf b/regress/freebsd.conf new file mode 100644 index 0000000000..c1bbf96866 --- /dev/null +++ b/regress/freebsd.conf @@ -0,0 +1,38 @@ +# Where to get the source to be tested +# BACULA_SOURCE="${HOME}/bacula/branch-1.36.2" +BACULA_SOURCE="${HOME}/bacula/k" + +# Where to send email !!!!! Change me !!!!!!! +EMAIL=xxxx@domain.com +SMTP_HOST="machine.domain.com" + +# Full "default" path where to find sqlite (no quotes!) +SQLITE3_DIR=${HOME}/bacula/depkgs/sqlite3 +SQLITE_DIR=${HOME}/bacula/depkgs/sqlite + +TAPE_DRIVE="/dev/nsa0" +# if you don't have an autochanger set AUTOCHANGER to /dev/null +AUTOCHANGER="/dev/sg0" +# For two drive tests -- set to /dev/null if you do not have it +TAPE_DRIVE1="/dev/null" + +# This must be the path to the autochanger including its name +AUTOCHANGER_PATH="/usr/local/sbin/mtx" + +# Set your database here +#WHICHDB="--with-sqlite=${SQLITE_DIR}" +#WHICHDB="--with-sqlite3=${SQLITE3_DIR}" +WHICHDB="--with-mysql" +#WHICHDB="--with-postgresql" + +# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers" +TCPWRAPPERS="--with-tcp-wrappers" + +# Set this to "" to disable OpenSSL support, "--with-openssl=yes" +# to enable it, or provide the path to the OpenSSL installation, +# eg "--with-openssl=/usr/local" +# +# Note, you can also add any other (as many as you want) special +# Bacula configuration options here, such as --disable-batch-insert +# +OPENSSL="" diff --git a/regress/kern.conf b/regress/kern.conf new file mode 100644 index 0000000000..d7c6ef4a4d --- /dev/null +++ b/regress/kern.conf @@ -0,0 +1,51 @@ +# Where to get the source to be tested +#BACULA_SOURCE="${HOME}/bacula/bacula/branch-2.0" +BACULA_SOURCE="${HOME}/bacula/k" + +# Where to send email !!!!! Change me !!!!!!! +EMAIL=xxxx@omally +SMTP_HOST="localhost" + +# Full "default" path where to find sqlite (no quotes!) +SQLITE3_DIR=${HOME}/bacula/depkgs/sqlite3 +SQLITE_DIR=${HOME}/bacula/depkgs/sqlite + +TAPE_DRIVE="/dev/nst0" +# if you don't have an autochanger set AUTOCHANGER to /dev/null +AUTOCHANGER="/dev/sg0" +# For two drive tests -- set to /dev/null if you do not have it +TAPE_DRIVE1="/dev/null" + +# This must be the path to the autochanger including its name +AUTOCHANGER_PATH="/usr/sbin/mtx" + +# Set your database here +#WHICHDB="--with-sqlite=${SQLITE_DIR}" +#WHICHDB="--with-sqlite3=${SQLITE3_DIR}" +WHICHDB="--with-mysql" +#WHICHDB="--with-postgresql" + +# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers" +TCPWRAPPERS="--with-tcp-wrappers" + +# Set this to "" to disable OpenSSL support, "--with-openssl=yes" +# to enable it, or provide the path to the OpenSSL installation, +# eg "--with-openssl=/usr/local" +# +# Note, you can also add any other (as many as you want) special +# Bacula configuration options here, such as --disable-batch-insert +# +OPENSSL="--with-openssl" + +# You may put your real host name here, but localhost is valid also +# and it has the advantage that it works on a non-newtworked machine +HOST="localhost" + +# see --with-base-port at +# http://www.bacula.org/rel-manual/Installing_Bacula.html +# You only need to change this if you want to run more than one instance +# of regression testing on the same box. You'll need to set BASEPORT +# to values that do not overlap. BASEPORT is the first of three ports +# required by each instance, one for each of Dir, SD, and the FD. +# +BASEPORT=8101 diff --git a/regress/misc-tests b/regress/misc-tests new file mode 100644 index 0000000000..dd2734c56b --- /dev/null +++ b/regress/misc-tests @@ -0,0 +1,2 @@ +tests/btape-fill-full-tape +tests/eot-fail-tape diff --git a/regress/prototype.conf b/regress/prototype.conf new file mode 100644 index 0000000000..6fef8cb904 --- /dev/null +++ b/regress/prototype.conf @@ -0,0 +1,50 @@ +# Where to get the source to be tested +BACULA_SOURCE="${HOME}/bacula/bacula" + +# Where to send email !!!!! Change me !!!!!!! +EMAIL=my-name@domain.com +SMTP_HOST="localhost" + +# Full "default" path where to find sqlite (no quotes!) +SQLITE3_DIR=${HOME}/bacula/depkgs/sqlite3 +SQLITE_DIR=${HOME}/bacula/depkgs/sqlite + +TAPE_DRIVE="/dev/nst0" +# if you don't have an autochanger set AUTOCHANGER to /dev/null +AUTOCHANGER="/dev/sg0" +# For two drive tests -- set to /dev/null if you do not have it +TAPE_DRIVE1="/dev/null" + +# This must be the path to the autochanger including its name +AUTOCHANGER_PATH="/usr/sbin/mtx" + +# Set your database here +#WHICHDB="--with-sqlite=${SQLITE_DIR}" +#WHICHDB="--with-sqlite3=${SQLITE3_DIR}" +#WHICHDB="--with-postgresql" +WHICHDB="--with-mysql" + +# Set this to "--with-tcp-wrappers" or "--without-tcp-wrappers" +TCPWRAPPERS="--with-tcp-wrappers" + +# Set this to "" to disable OpenSSL support, "--with-openssl=yes" +# to enable it, or provide the path to the OpenSSL installation, +# eg "--with-openssl=/usr/local" +# +# Note, you can also add any other (as many as you want) special +# Bacula configuration options here, such as --disable-batch-insert +# +OPENSSL="--with-openssl" + +# You may put your real host name here, but localhost is valid also +# and it has the advantage that it works on a non-newtworked machine +HOST="localhost" + +# see --with-base-port at +# http://www.bacula.org/rel-manual/Installing_Bacula.html +# You only need to change this if you want to run more than one instance +# of regression testing on the same box. You'll need to set BASEPORT +# to values that do not overlap. BASEPORT is the first of three ports +# required by each instance, one for each of Dir, SD, and the FD. +# +BASEPORT=8101 diff --git a/regress/run b/regress/run new file mode 100755 index 0000000000..d48e2623c6 --- /dev/null +++ b/regress/run @@ -0,0 +1,3 @@ +#!/bin/sh +bin/bacula start +bin/bconsole -c bin/bconsole.conf diff --git a/regress/scripts/ansi-sd-tape.conf.in b/regress/scripts/ansi-sd-tape.conf.in new file mode 100644 index 0000000000..5993e12456 --- /dev/null +++ b/regress/scripts/ansi-sd-tape.conf.in @@ -0,0 +1,55 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 2.2 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = DDS-4 # + Media Type = DDS-4 + Archive Device = @tape_drive@ + AutomaticMount = yes; # when device opened, read it + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +# MaximumVolumeSize = 400M + Label Type = ansi +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-dir-2d.conf.in b/regress/scripts/bacula-dir-2d.conf.in new file mode 100644 index 0000000000..41f3b61443 --- /dev/null +++ b/regress/scripts/bacula-dir-2d.conf.in @@ -0,0 +1,179 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 2.1.x +# +# Special conf for testing two tape drives with two different +# Media. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "dir-pw" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "client-pw" + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definition of DDS tape storage device +Storage { + Name = DDS-4 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "storage-pw" + Device = DDS-4 # must be same as Device in Storage daemon + Media Type = DDS-4 # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 + Autochanger = yes +} + + +# Definition of DLT tape storage device +Storage { + Name = DLT80 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "storage-pw" + Device = DLT80 # must be same as Device in Storage daemon + Media Type = DLT8000 # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Full + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Inc + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Scratch + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + Recycle Pool = Scratch # recycle back here +} diff --git a/regress/scripts/bacula-dir-fifo.conf.in b/regress/scripts/bacula-dir-fifo.conf.in new file mode 100644 index 0000000000..fdfd628a27 --- /dev/null +++ b/regress/scripts/bacula-dir-fifo.conf.in @@ -0,0 +1,226 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.33 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = Dummy + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "NightlySave1" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = Dummy + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no + Client Run Before Job = "/bin/sleep 120" +} + +Job { + Name = "NightlySave2" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = Dummy + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "VerifyTape" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Verify Set" + Storage = Dummy + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = Dummy + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "Verify Set" + Include { + Options { + signature=MD5 + verify=pins1 + } + File = "<@tmpdir@/file-list" + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definition of DDS tape storage device +Storage { + Name = Dummy + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = Dummy # must be same as Device in Storage daemon + Media Type = Dummy # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 +# Autochanger = yes +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula Regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Full + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Inc + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Scratch + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-dir-migration.conf.in b/regress/scripts/bacula-dir-migration.conf.in new file mode 100644 index 0000000000..36fcfbff33 --- /dev/null +++ b/regress/scripts/bacula-dir-migration.conf.in @@ -0,0 +1,229 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "migrate-job" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = Job + Selection Pattern = ".*Save" +} + +Job { + Name = "migrate-volume" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratevol.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = Volume + Selection Pattern = "File*" +} + +Job { + Name = "migrate-occupancy" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = PoolOccupancy +} + +Job { + Name = "migrate-time" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = PoolTime +} + + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definition of DDS Virtual tape disk storage device +Storage { + Name = DiskChanger + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = DiskChanger # must be same as Device in Storage daemon + Media Type = DiskChangerMedia # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 + Autochanger = yes +} + +# Definition of file storage device +Storage { + Name = File + Address = @hostname@ + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 5 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + NextPool = Full + Storage = File + Migration High Bytes = 40M + Migration Low Bytes = 20M + Migration Time = 60 +} + +Pool { + Name = Full + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + Storage = DiskChanger +} diff --git a/regress/scripts/bacula-dir-tape.conf.in b/regress/scripts/bacula-dir-tape.conf.in new file mode 100644 index 0000000000..de1c3f2c1f --- /dev/null +++ b/regress/scripts/bacula-dir-tape.conf.in @@ -0,0 +1,240 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.33 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "NightlySave1" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no + Client Run Before Job = "/bin/sleep 120" +} + +Job { + Name = "NightlySave2" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "VerifyTape" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Verify Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "Verify Set" + Include { + Options { + signature=MD5 + verify=pins1 + } + File = <@tmpdir@/file-list + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definition of DDS tape storage device +Storage { + Name = DDS-4 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = DDS-4 # must be same as Device in Storage daemon + Media Type = DDS-4 # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 +# Autochanger = yes +} + + +# Definition of File storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = FileStorage # must be same as Device in Storage daemon + Media Type = FileMedia # must be same as MediaType in Storage daemon + Maximum Concurrent Jobs = 4 +} + + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Full + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Inc + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = Scratch + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + Recycle Pool = Scratch # recycle back here +} diff --git a/regress/scripts/bacula-dir-win32-tape.conf.in b/regress/scripts/bacula-dir-win32-tape.conf.in new file mode 100644 index 0000000000..c91eff7f69 --- /dev/null +++ b/regress/scripts/bacula-dir-win32-tape.conf.in @@ -0,0 +1,144 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.33 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=Tibs + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +} + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=Tibs + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Enable VSS = yes + Include { Options { signature=MD5 } + File = "c:" + } +} + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = Tibs + Address = tibs + FDPort = 9102 + Catalog = MyCatalog + Password = "xBzFq+a9llZyGyfMaNO9e3outP86/1AUAT8P34RoT62G" + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definition of DDS tape storage device +Storage { + Name = DDS-4 + Address = 192.168.68.112 # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = DDS-4 # must be same as Device in Storage daemon + Media Type = DDS-4 # must be same as MediaType in Storage daemon + AutoChanger = yes + Maximum Concurrent Jobs = 4 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression Job %j\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-dir.conf.errors.in b/regress/scripts/bacula-dir.conf.errors.in new file mode 100644 index 0000000000..23d080a1ff --- /dev/null +++ b/regress/scripts/bacula-dir.conf.errors.in @@ -0,0 +1,223 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39.27 (24 October 2006) -- debian testing/unstable +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard + fdconnecttimeout = 20 + sdconnecttimeout = 20 +} + +JobDefs { + Name = "DefaultJob" + Type = Backup + Level = Incremental + client=@hostname@-fd + Storage = File + Messages = Standard + Pool = Default + Priority = 10 + Maximum Concurrent Jobs = 16 +} + +Job { + Name = "LOCAL_INC_ERR" + JobDefs = DefaultJob + FileSet = FS_LOCAL_INC_ERR + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} + +FileSet { + Name = FS_TEST + Include { + File=<@tmpdir@/file-list + } +} + +FileSet { + Name = FS_REMOTE_INC_ERR + Include { + File="\<@tmpdir@/path/to/nowhere" + } +} + +Job { + Name = "REMOTE_INC_ERR" + JobDefs = DefaultJob + FileSet = FS_REMOTE_INC_ERR + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} + +FileSet { + Name = FS_LOCAL_INC_ERR + Include { File=<@tmpdir@/path/to/nowhere } +} + +FileSet { + Name = FS_LOCAL_EXCL_ERR + Include { File=<@tmpdir@/file-list } + Exclude { + File=<@tmpdir@/path/to/nowhere + } +} + +Job { + Name = "LOCAL_EXCL_ERR" + JobDefs = DefaultJob + FileSet = FS_LOCAL_EXCL_ERR + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} + + +FileSet { + Name = FS_REMOTE_EXCL_ERR + Include { File=<@tmpdir@/file-list } + Exclude { + File="\<@tmpdir@/path/to/nowhere" + } +} + +Job { + Name = "REMOTE_EXCL_ERR" + JobDefs = DefaultJob + FileSet = FS_REMOTE_EXCL_ERR + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} +Job { + Name = "REMOTE_RUNSCRIPT_ERR" + JobDefs = DefaultJob + FileSet = FS_TEST + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/false" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} +Job { + Name = "LOCAL_RUNSCRIPT_ERR" + JobDefs = DefaultJob + FileSet = FS_TEST + RunBeforeJob = "/bin/false" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} +Job { + Name = "CLIENT_CONNECT_TIMEOUT" + JobDefs = DefaultJob + Client = @hostname@2-fd + FileSet = FS_TEST + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} +Job { + Name = "SD_CONNECT_TIMEOUT" + JobDefs = DefaultJob + Client = @hostname@-fd + FileSet = FS_TEST + Storage = File2 + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Client (File Services) to backup +Client { + Name = @hostname@2-fd + Address = @hostname@ + FDPort = 7102 + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device not responding +Storage { + Name = File2 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = 7103 + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File2 + Maximum Concurrent Jobs = 4 +} + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + + +Messages { + Name = Standard + console = all, !skipped, !saved +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-dir.conf.maxtime.in b/regress/scripts/bacula-dir.conf.maxtime.in new file mode 100644 index 0000000000..9b3fc2a9fb --- /dev/null +++ b/regress/scripts/bacula-dir.conf.maxtime.in @@ -0,0 +1,136 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39.27 (24 October 2006) -- debian testing/unstable +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 1 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +JobDefs { + Name = "DefaultJob" + Type = Backup + Level = Incremental + Client = @hostname@-fd + FileSet = FS_TESTJOB + Storage = File + Messages = Standard + Pool = Default + Priority = 10 + Maximum Concurrent Jobs = 16 +} + +FileSet { + Name = FS_TESTJOB + Include { + File=<@tmpdir@/file-list + } +} + +FileSet { + Name = FS_FIFO + Include { + Options { + read fifo = yes + } + # wait 60s per fifo + File=@tmpdir@/fifo + File=@tmpdir@/fifo2 + File=@tmpdir@/fifo3 + } +} + +Job { + Name = "RUN_MAXWAITTIME" + JobDefs = DefaultJob + FileSet = FS_TESTJOB + MaxWaitTime = 2min +} + +Job { + Name = "RUN_MAXSTARTDELAY" + JobDefs = DefaultJob + FileSet = FS_TESTJOB + MaxStartDelay = 30sec + Pool = PoolA + Runbeforejob = "/bin/echo NEVER start this" +} + +Job { + Name = "RUN_MAXRUNTIME" + JobDefs = DefaultJob + FileSet = FS_FIFO + MaxRunTime = 1min +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + + +Messages { + Name = Standard + console = all, !skipped, !saved +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + + +# Default pool definition +Pool { + Name = PoolA + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-dir.conf.regexwhere.in b/regress/scripts/bacula-dir.conf.regexwhere.in new file mode 100644 index 0000000000..d2e79e634d --- /dev/null +++ b/regress/scripts/bacula-dir.conf.regexwhere.in @@ -0,0 +1,136 @@ +# TODO +# Orphaned buffer: localhost-dir 40 bytes buf=80e9a70 allocated at dird_conf.c:1338 +# bacula-dir: dird.c:656 Hey something is wrong. p=0x135174768 + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +Job { + Name = "backup" + Type = Backup + Level = Full + Client = @hostname@-fd + FileSet = FS_TESTJOB + Storage = File + Messages = Standard + Pool = Default + Priority = 10 + Maximum Concurrent Jobs = 16 +} + +FileSet { + Name = FS_TESTJOB + Include { + File=<@tmpdir@/file-list + } +} + +JobDefs { + Name = "DefaultRestore" + Type = Restore + Storage = File + Client=@hostname@-fd + FileSet="FS_TESTJOB" + Messages = Standard + Pool = Default + Replace = Always +} + +Job { + Name = JobA + JobDefs = DefaultRestore + RegexWhere = !po$!old.po! +} + +Job { + Name = JobB + JobDefs = DefaultRestore + add prefix = @tmpdir@/bacula-restore + add suffix = .old + strip prefix = /build +} + +Job { + Name = JobC + JobDefs = DefaultRestore + Where = @tmpdir@/bacula-restore +} + +Job { + Name = JobD + JobDefs = DefaultRestore + RegexWhere = "doesnt work" +} + +Job { + Name = JobE + JobDefs = DefaultRestore + RegexWhere = "/BUILD/tmp/i,!po/!!" +} + +Job { + Name = JobF + JobDefs = DefaultRestore + RegexWhere = "/something witch doesn't match/tmp/i" +} + +Job { + Name = JobG + JobDefs = DefaultRestore + Where = @tmpdir@/bacula-restore +} + + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + + +Messages { + Name = Standard + console = all, !skipped, !saved +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-dir.conf.testrunscript.in b/regress/scripts/bacula-dir.conf.testrunscript.in new file mode 100644 index 0000000000..abd107053c --- /dev/null +++ b/regress/scripts/bacula-dir.conf.testrunscript.in @@ -0,0 +1,221 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39.27 (24 October 2006) -- debian testing/unstable +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +JobDefs { + Name = "DefaultJob" + Type = Backup + Level = Incremental + Client = @hostname@-fd + FileSet = FS_TESTJOB + Storage = File + Messages = Standard + Pool = Default + Priority = 10 + Maximum Concurrent Jobs = 16 +} + +FileSet { + Name = FS_TESTJOB + Include { + File=<@tmpdir@/file-list + } +} + +#dir: BeforeJob: run command "/bin/echo RunBeforeJob" +#fd: ClientRunBeforeJob: ClientRunBeforeJob +#fd: ClientAfterJob: run command "/bin/echo ClientRunAfterJob" +#dir: AfterJob: run command "/bin/echo RunAfterJob" + +Job { + Name = "RUN_ALL_OK" + JobDefs = DefaultJob + FileSet = FS_TESTJOB + RunBeforeJob = "/bin/echo RunBeforeJob" + ClientRunBeforeJob = "/bin/echo ClientRunBeforeJob" + Run After Job = "/bin/echo RunAfterJob" + ClientRunAfterJob = "/bin/echo ClientRunAfterJob" +} + +#After job are after before job +Job { + Name = "RUN_DIR_FAILED_BUG" + FileSet = FS_TESTJOB + JobDefs = DefaultJob + Run After Failed Job = "/bin/echo RunAfterFailedJob" + RunBeforeJob = "/bin/false" +} + +#@hostname@-dir: BeforeJob: run command "/bin/false" +#@hostname@-dir: BeforeJob: RunAfterFailedJob +Job { + Name = "RUN_DIR_FAILED" + FileSet = FS_TESTJOB + JobDefs = DefaultJob + RunBeforeJob = "/bin/false RUN_DIR_FAILED" + Run After Failed Job = "/bin/echo RunAfterFailedJob" +} + +#@hostname@-fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1" +#@hostname@-fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED2" +#@hostname@-dir: AfterJob: run command "/bin/echo RunAfterFailedJob" +Job { + Name = "RUN_FD_FAILED" + FileSet = FS_TESTJOB + JobDefs = DefaultJob + RunScript { + Command = "/bin/false RUN_FD_FAILED1" + failjobonerror = no + RunsWhen = Before + } + RunScript { + Command = "/bin/false RUN_FD_FAILED2" + failjobonerror = yes + RunsWhen = Before + } + + Run After Failed Job = "/bin/echo RunAfterFailedJob" + RunScript { + Command = "/bin/echo touching @tmpdir@/RUN_FD_FAILED" + RunsWhen = after + RunsOnFailure = yes + } + RunScript { + Command = "/bin/touch @tmpdir@/RUN_FD_FAILED" + RunsWhen = after + RunsOnFailure = yes + } +} + +#@hostname@-fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1" +#we dont execute FAILED2 +#@hostname@-dir: AfterJob: run command "/bin/echo RunAfterFailedJob" +Job { + Name = "RUN_FD_FAILED2" + FileSet = FS_TESTJOB + JobDefs = DefaultJob + RunScript { + Command = "/bin/false RUN_FD_FAILED1" + failjobonerror = yes + RunsWhen = Before + } + RunScript { + Command = "/bin/false RUN_FD_FAILED2" + failjobonerror = yes + RunsWhen = Before + } + RunScript { + Command = "/bin/false RUN_FD_FAILED3" + failjobonerror = yes + RunsOnFailure = yes + RunsWhen = Before + } + + Run After Failed Job = "/bin/echo RunAfterFailedJob" +} + +#@hostname@-fd: ClientBeforeJob: run command "/bin/false RUN_FD_WARNING" +#Backup OK -- with warnings +Job { + Name = "RUN_FD_WARNING" + FileSet = FS_TESTJOB + JobDefs = DefaultJob + RunScript { + Command = "/bin/false RUN_FD_WARNING" + failjobonerror = no + RunsWhen = Before + } + Run After Failed Job = "/bin/echo RunAfterFailedJob" +} + +FileSet { + Name = FS_FIFO + Include { + Options { readfifo = yes } + File=<@tmpdir@/file-list + } +} + +Job { + Name = BUG_897 + JobDefs = DefaultJob + FileSet = FS_FIFO + + RunScript { + Command = "/bin/echo touching @tmpdir@/RUN_BUG_897" + RunsWhen = after + RunsOnFailure = yes + } + RunScript { + Command = "/bin/touch @tmpdir@/RUN_BUG_897" + RunsWhen = after + RunsOnFailure = yes + } +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + + +Messages { + Name = Standard + console = all, !skipped, !saved +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/bacula-fd-2d.conf.in b/regress/scripts/bacula-fd-2d.conf.in new file mode 100644 index 0000000000..c98affced2 --- /dev/null +++ b/regress/scripts/bacula-fd-2d.conf.in @@ -0,0 +1,33 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 2.1.29 (31 July 2007) -- suse 10.2 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = @hostname@-dir + Password = "client-pw" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = @hostname@-fd + FDPort = @fdport@ # where we listen for the director + WorkingDirectory = @working_dir@ + Pid Directory = @piddir@ + Maximum Concurrent Jobs = 20 +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = @hostname@-dir = all, !skipped, !restored +} diff --git a/regress/scripts/bacula-sd-2d.conf.in b/regress/scripts/bacula-sd-2d.conf.in new file mode 100644 index 0000000000..466b68fcc6 --- /dev/null +++ b/regress/scripts/bacula-sd-2d.conf.in @@ -0,0 +1,70 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 2.1.x +# +# Special configuration for testing two different tape drives +# with different Media +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "storage-pw" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DDS-4 + Changer Device = @autochanger@ + Changer Command ="@scriptdir@/mtx-changer %c %o %S %a %d" + Device = Drive-0 +} + +Device { + Name = Drive-0 + Media Type = DDS-4 + Archive Device = @tape_drive@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +} + +Device { + Name = DLT80 + Media Type = DLT8000 + Archive Device = @tape_drive1@ + AutomaticMount = yes; # when device opened, read it + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +} + + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-2disk-drive.conf.in b/regress/scripts/bacula-sd-2disk-drive.conf.in new file mode 100644 index 0000000000..10754d9e94 --- /dev/null +++ b/regress/scripts/bacula-sd-2disk-drive.conf.in @@ -0,0 +1,75 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.39 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DDS-4 + Changer Device = @disk_drive@/conf + Changer Command ="@scriptdir@/disk-changer %c %o %S %a %d" + Device = Drive-0, Drive-1 +} + +Device { + Name = Drive-0 + Device Type = File + Media Type = DDS-4 + Archive Device = @disk_drive@/drive0 + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; +# Maximum File Size = 1000000 +} + +Device { + Name = Drive-1 + Device Type = File + Media Type = DDS-4 + Archive Device = @disk_drive@/drive1 + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 1 + AlwaysOpen = yes; + RemovableMedia = yes; +# Maximum File Size = 1000000 +} + + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-2disk.conf.in b/regress/scripts/bacula-sd-2disk.conf.in new file mode 100644 index 0000000000..fd5f973f1a --- /dev/null +++ b/regress/scripts/bacula-sd-2disk.conf.in @@ -0,0 +1,73 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.39 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DDS-4 + Changer Device = @disk_drive@/conf + Changer Command ="@scriptdir@/disk-changer %c %o %S %a %d" + Device = Drive-0 +} + +Device { + Name = Drive-0 # + Device Type = File + Media Type = DDS-4 + Archive Device = @disk_drive@/drive0 + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; +# Maximum File Size = 1000000 +} + +Device { + Name = FileStorage + Media Type = FileMedia + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabeled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +} + + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-2drive.conf.in b/regress/scripts/bacula-sd-2drive.conf.in new file mode 100644 index 0000000000..8ee4dbd629 --- /dev/null +++ b/regress/scripts/bacula-sd-2drive.conf.in @@ -0,0 +1,75 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DDS-4 + Changer Device = @autochanger@ + Changer Command ="@scriptdir@/mtx-changer %c %o %S %a %d" + Device = Drive-0, Drive-1 +} + +Device { + Name = Drive-0 + Media Type = DDS-4 + Archive Device = @tape_drive@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +} + +Device { + Name = Drive-1 + Media Type = DDS-4 + Archive Device = @tape_drive1@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 1 + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +} + + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-2tape.conf.in b/regress/scripts/bacula-sd-2tape.conf.in new file mode 100644 index 0000000000..4abd813945 --- /dev/null +++ b/regress/scripts/bacula-sd-2tape.conf.in @@ -0,0 +1,61 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DDS-4 + Changer Device = @autochanger@ + Changer Command ="@scriptdir@/mtx-changer %c %o %S %a %d" + Device = Drive-0 +} + +Device { + Name = Drive-0 # + Media Type = DDS-4 + Archive Device = @tape_drive@ + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-fifo.conf.in b/regress/scripts/bacula-sd-fifo.conf.in new file mode 100644 index 0000000000..b2a521ec96 --- /dev/null +++ b/regress/scripts/bacula-sd-fifo.conf.in @@ -0,0 +1,49 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +Device { + Name = Dummy + Media Type = Dummy + Device Type = Fifo + Archive Device = /dev/null + LabelMedia = yes + Random Access = no + AutomaticMount = no + RemovableMedia = no + MaximumOpenWait = 60 + AlwaysOpen = no +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-migration.conf.in b/regress/scripts/bacula-sd-migration.conf.in new file mode 100644 index 0000000000..d4b691ee7c --- /dev/null +++ b/regress/scripts/bacula-sd-migration.conf.in @@ -0,0 +1,72 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.39 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# +Autochanger { + Name = DiskChanger + Changer Device = @disk_drive@/conf + Changer Command ="@scriptdir@/disk-changer %c %o %S %a %d" + Device = Drive-0 +} + +Device { + Name = Drive-0 # + Device Type = File + Media Type = DiskChangerMedia + Archive Device = @disk_drive@/drive0 + AutomaticMount = yes; # when device opened, read it + Autochanger = yes + Drive Index = 0 + AlwaysOpen = yes; + RemovableMedia = yes; +# Maximum File Size = 1000000 +} + +Device { + Name = FileStorage + Media Type = File + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabeled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd-tape.conf.in b/regress/scripts/bacula-sd-tape.conf.in new file mode 100644 index 0000000000..4d710efd35 --- /dev/null +++ b/regress/scripts/bacula-sd-tape.conf.in @@ -0,0 +1,54 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = DDS-4 # + Media Type = DDS-4 + Archive Device = @tape_drive@ + AutomaticMount = yes; # when device opened, read it + AlwaysOpen = yes; + RemovableMedia = yes; + @@sbindir@/tape_options +# Maximum File Size = 1000000 +# MaximumVolumeSize = 400M +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/bacula-sd.conf.in b/regress/scripts/bacula-sd.conf.in new file mode 100644 index 0000000000..025400c2b1 --- /dev/null +++ b/regress/scripts/bacula-sd.conf.in @@ -0,0 +1,74 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = rufus-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "/home/kern/bacula/regress/working" + Pid Directory = "/home/kern/bacula/regress/working" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = rufus-dir + Password = "BzlEl8haeFmnv/Lv8V6zDzUBgFFQNsUtny6VkmccQpOy" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = FileStorage + Media Type = File + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabeled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +} + +#Device { +# Name = DDS-4 # +# Media Type = DDS-4 +# Archive Device = /dev/nst0 +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = yes; +# RemovableMedia = yes; +#} + +# +# A very old Exabyte with no end of media detection +# +#Device { +# Name = "Exabyte 8mm" +# Media Type = "8mm" +# Archive Device = /dev/nst0 +# Hardware end of medium = No; +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = Yes; +# RemovableMedia = yes; +#} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = rufus-dir = all, !terminate +} diff --git a/regress/scripts/bconsole-2d.conf.in b/regress/scripts/bconsole-2d.conf.in new file mode 100644 index 0000000000..00bcfb6f7b --- /dev/null +++ b/regress/scripts/bconsole-2d.conf.in @@ -0,0 +1,10 @@ +# +# Bacula User Agent (or Console) Configuration File +# + +Director { + Name = @hostname@-dir + DIRPort = @dirport@ + address = @hostname@ + Password = "dir-pw" +} diff --git a/regress/scripts/check_for_zombie_jobs b/regress/scripts/check_for_zombie_jobs new file mode 100755 index 0000000000..d35a5ffc37 --- /dev/null +++ b/regress/scripts/check_for_zombie_jobs @@ -0,0 +1,84 @@ +#!/bin/sh +# +# Check for zombie jobs (not terminated). +# Also scan logs for ERROR messages +# + +# check_for_zombie_jobs storage=STORAGE [client=localhost-fd] + +if [ $# = 2 ] ; then + client="$2" +else + client="client" +fi + +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +@output tmp/dir.out +status dir +@output tmp/fd.out +status $client +@output tmp/sd.out +status $1 +@output +quit +END_OF_DATA + +export zstat +grep "No Jobs running." tmp/dir.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " !!!! Zombie Jobs in Director !!!!" + echo " !!!! Zombie Jobs in Director !!!!" >>test.out + echo " " + zstat=1 + exit 1 +fi +grep "No Jobs running." tmp/fd.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " !!!! Zombie Jobs in File daemon !!!!" + echo " !!!! Zombie Jobs in File daemon !!!!" >>test.out + echo " " + zstat=1 + exit 1 +fi +grep "No Jobs running." tmp/sd.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " !!!! Zombie Jobs in Storage daemon !!!!" + echo " !!!! Zombie Jobs in Storage daemon !!!!" >>test.out + echo " " + zstat=1 + exit 1 +fi +grep "ERROR" tmp/log*.out 2>&1 >/dev/null +if [ $? = 0 ] ; then + echo " " + echo " !!!! ERROR in log output !!!!" + echo " !!!! ERROR in log output !!!!" >>test.out + grep "ERROR" tmp/log*.out + echo " " + zstat=1 + exit 1 +fi +grep "Fatal Error" tmp/log*.out 2>&1 >/dev/null +if [ $? = 0 ] ; then + echo " " + echo " !!!! Fatal Error in log output !!!!" + echo " !!!! Fatal Error in log output !!!!" >>test.out + grep "Fatal Error" tmp/log*.out + echo " " + zstat=1 + exit 1 +fi + +grep "glibc detected" tmp/log*.out 2>&1 >/dev/null +if [ $? = 0 ] ; then + echo " " + echo " !!!! glibc detected Error in log output !!!!" + echo " !!!! glibc detected Error in log output !!!!" >>test.out + grep "glibc detected" tmp/log*.out + echo " " + zstat=1 + exit 1 +fi diff --git a/regress/scripts/cleanup b/regress/scripts/cleanup new file mode 100755 index 0000000000..e301244bb1 --- /dev/null +++ b/regress/scripts/cleanup @@ -0,0 +1,25 @@ +#!/bin/sh +# +# Cleanup left over files -- both before and after test run +# +cwd=`pwd` +rm -rf ${cwd}/tmp/FileVolume* +rm -rf ${cwd}/tmp/TestVolume001 ${cwd}/tmp/bacula-restores ${cwd}/tmp/Small* +rm -rf ${cwd}/tmp/sed_tmp ${cwd}/tmp/file-list +rm -rf tmp/* +rm -rf working/log tmp/TEST-* +rm -rf working/*.bsr +rm -rf ${cwd}/tmp/disk-changer +find . -name "gigaslam.gif" -exec rm -f {} \; + + +# bin directory does not always exist +if [ -d bin ] +then + bin/bacula stop 2>&1 >/dev/null + cd bin + ./drop_bacula_tables >/dev/null 2>&1 + ./make_bacula_tables >/dev/null 2>&1 + ./grant_bacula_privileges >/dev/null 2>&1 + cd .. +fi diff --git a/regress/scripts/cleanup-2drive.in b/regress/scripts/cleanup-2drive.in new file mode 100755 index 0000000000..32b27c019e --- /dev/null +++ b/regress/scripts/cleanup-2drive.in @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Cleanup left over files -- both before and after test run +# +scripts/cleanup + +if test x@autochanger@ != x/dev/null; then + slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1` + echo "Slot $slot in drive 1" + if test x$slot != x0 ; then + echo "unload slot $slot in drive 1" + bin/mtx-changer @autochanger@ unload $slot @tape_drive1@ 1 + fi + slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive@ 0` + echo "Slot $slot in drive 0" + if test x$slot != x0 ; then + echo "unload slot $slot in drive 0" + bin/mtx-changer @autochanger@ unload $slot @tape_drive@ 0 + fi + + + slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1` + if test x$slot != x2; then + echo "load slot 2 in drive 1" + bin/mtx-changer @autochanger@ load 2 @tape_drive1@ 1 + fi + echo "WEOF drive 1" + mt -f @tape_drive1@ rewind + mt -f @tape_drive1@ weof + echo "unload slot 2 in drive 1" + bin/mtx-changer @autochanger@ unload 2 @tape_drive1@ 1 + + slot=`bin/mtx-changer @autochanger@ loaded 0 @tape_drive@ 0` + echo "Slot $slot in drive 0" + if test x$slot != x1; then + echo "load slot 1 in drive 0" + bin/mtx-changer @autochanger@ load 1 @tape_drive@ 0 + fi + echo "WEOF drive 0" + mt -f @tape_drive@ rewind + mt -f @tape_drive@ weof + echo "unload slot 1 from drive 0" + bin/mtx-changer @autochanger@ unload 1 @tape_drive@ 0 +fi diff --git a/regress/scripts/cleanup-2tape.in b/regress/scripts/cleanup-2tape.in new file mode 100755 index 0000000000..0f33ec95c7 --- /dev/null +++ b/regress/scripts/cleanup-2tape.in @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Cleanup left over files -- both before and after test run +# +scripts/cleanup + +if test x@autochanger@ != x/dev/null; then + drive=`bin/mtx-changer @autochanger@ loaded 0 dummy 0` + if test x${drive} != x2; then + bin/mtx-changer @autochanger@ unload 0 @tape_drive@ 0 + bin/mtx-changer @autochanger@ load 2 @tape_drive@ 0 + fi + mt -f @tape_drive@ rewind + mt -f @tape_drive@ weof +fi + + +# +# If we have an autochanger always load tape in slot 1 +# +if test x@autochanger@ != x/dev/null; then + drive=`bin/mtx-changer @autochanger@ loaded 0 dummy 0` + if test x${drive} != x1; then + bin/mtx-changer @autochanger@ unload 0 @tape_drive@ 0 + bin/mtx-changer @autochanger@ load 1 @tape_drive@ 0 + fi +fi + +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof diff --git a/regress/scripts/cleanup-tape.in b/regress/scripts/cleanup-tape.in new file mode 100755 index 0000000000..98ed537766 --- /dev/null +++ b/regress/scripts/cleanup-tape.in @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Cleanup left over files -- both before and after test run +# +scripts/cleanup + +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof diff --git a/regress/scripts/copy-2disk-confs b/regress/scripts/copy-2disk-confs new file mode 100755 index 0000000000..87790955f0 --- /dev/null +++ b/regress/scripts/copy-2disk-confs @@ -0,0 +1,12 @@ +#!/bin/sh +# +# Setup for using the Virtual Disk Changer (simulates tape changer) +# +/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-2disk.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +outf="tmp/sed_tmp" +echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} +cp bin/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >bin/bacula-dir.conf diff --git a/regress/scripts/copy-2disk-drive-confs b/regress/scripts/copy-2disk-drive-confs new file mode 100755 index 0000000000..7a5dcd30ea --- /dev/null +++ b/regress/scripts/copy-2disk-drive-confs @@ -0,0 +1,10 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-2disk-drive.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +outf="tmp/sed_tmp" +echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} +cp bin/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >bin/bacula-dir.conf + diff --git a/regress/scripts/copy-2drive-confs b/regress/scripts/copy-2drive-confs new file mode 100755 index 0000000000..0388c4c175 --- /dev/null +++ b/regress/scripts/copy-2drive-confs @@ -0,0 +1,15 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-2drive.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +outf="tmp/sed_tmp" +echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} +cp bin/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >bin/bacula-dir.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-2tape-confs b/regress/scripts/copy-2tape-confs new file mode 100755 index 0000000000..e23adc5c82 --- /dev/null +++ b/regress/scripts/copy-2tape-confs @@ -0,0 +1,15 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-2tape.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +outf="tmp/sed_tmp" +echo "s%# Autochanger = yes% Autochanger = yes%g" >${outf} +cp bin/bacula-dir.conf tmp/1 +sed -f ${outf} tmp/1 >bin/bacula-dir.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-confs b/regress/scripts/copy-confs new file mode 100755 index 0000000000..c12a20a359 --- /dev/null +++ b/regress/scripts/copy-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd.conf bin/bacula-sd.conf +/bin/cp -f scripts/bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/bconsole.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-crypto-confs b/regress/scripts/copy-crypto-confs new file mode 100755 index 0000000000..c981df30fb --- /dev/null +++ b/regress/scripts/copy-crypto-confs @@ -0,0 +1,7 @@ +#!/bin/sh +/bin/cp -f scripts/new-test-bacula-dir.conf bin/bacula-dir.conf +/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf +/bin/cp -f scripts/crypto-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +/bin/cp -f scripts/cryptokeypair.pem bin/cryptokeypair.pem +/bin/cp -f scripts/master2048.cert bin/master2048.cert diff --git a/regress/scripts/copy-fifo-confs b/regress/scripts/copy-fifo-confs new file mode 100755 index 0000000000..812b731967 --- /dev/null +++ b/regress/scripts/copy-fifo-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir-fifo.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-fifo.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-migration-confs b/regress/scripts/copy-migration-confs new file mode 100755 index 0000000000..c7680bc40e --- /dev/null +++ b/regress/scripts/copy-migration-confs @@ -0,0 +1,8 @@ +#!/bin/sh +# +# Setup for using the Virtual Disk Changer (simulates tape changer) +# +/bin/cp -f scripts/bacula-dir-migration.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-migration.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf diff --git a/regress/scripts/copy-tape-confs b/regress/scripts/copy-tape-confs new file mode 100755 index 0000000000..c8dae32c4a --- /dev/null +++ b/regress/scripts/copy-tape-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-tape.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-test-confs b/regress/scripts/copy-test-confs new file mode 100755 index 0000000000..5552c77116 --- /dev/null +++ b/regress/scripts/copy-test-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/new-test-bacula-dir.conf bin/bacula-dir.conf +/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-testa-confs b/regress/scripts/copy-testa-confs new file mode 100755 index 0000000000..46116b9f90 --- /dev/null +++ b/regress/scripts/copy-testa-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/testa-bacula-dir.conf bin/bacula-dir.conf +/bin/cp -f scripts/test-bacula-sd.conf bin/bacula-sd.conf +/bin/cp -f scripts/test-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/copy-tls-confs b/regress/scripts/copy-tls-confs new file mode 100755 index 0000000000..af61e453cd --- /dev/null +++ b/regress/scripts/copy-tls-confs @@ -0,0 +1,8 @@ +#!/bin/sh + +/bin/cp -f scripts/tls-bacula-dir.conf bin/bacula-dir.conf +/bin/cp -f scripts/tls-bacula-sd.conf bin/bacula-sd.conf +/bin/cp -f scripts/tls-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf +/bin/cp -f scripts/tls-CA.pem bin/tls-CA.pem +/bin/cp -f scripts/tls-cert.pem bin/tls-cert.pem diff --git a/regress/scripts/copy-win32-confs b/regress/scripts/copy-win32-confs new file mode 100755 index 0000000000..7cda59aabc --- /dev/null +++ b/regress/scripts/copy-win32-confs @@ -0,0 +1,11 @@ +#!/bin/sh +/bin/cp -f scripts/win32-bacula-dir-tape.conf bin/bacula-dir.conf +/bin/cp -f scripts/win32-bacula-sd-tape.conf bin/bacula-sd.conf +/bin/cp -f scripts/win32-bacula-fd.conf bin/bacula-fd.conf +/bin/cp -f scripts/test-console.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi diff --git a/regress/scripts/crypto-bacula-fd.conf.in b/regress/scripts/crypto-bacula-fd.conf.in new file mode 100644 index 0000000000..540bc107bf --- /dev/null +++ b/regress/scripts/crypto-bacula-fd.conf.in @@ -0,0 +1,37 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 2.0 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = @hostname@-dir + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = @hostname@-fd + FDPort = @fdport@ # where we listen for the director + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + SubSys Directory = "@subsysdir@" + PKI Signatures = Yes + PKI Encryption = Yes + PKI Keypair = "@scriptdir@/cryptokeypair.pem" + PKI Master Key = "@scriptdir@/master2048.cert" +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/cryptokeypair.pem b/regress/scripts/cryptokeypair.pem new file mode 100644 index 0000000000..440dcce4f0 --- /dev/null +++ b/regress/scripts/cryptokeypair.pem @@ -0,0 +1,23 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBAKIc649Amif6weq+c8rVtS7jyn7E9oZ9Irrl9WviQZi0+J2OLgCi +PNaj/FzPhTIgBBRFEP0ZU5DfVv6CoXKbpr8CAwEAAQJAQbvUUFvzpi5pnxPmw+Jv ++zlmjIy1Icdv47UHFN3Dl3V0+X05g12xUlnyNKzo2jlSwkBi1w8AJCMV6/TnnLiI +AQIhAM4SH9cb01DUH+1O5gk90GgNYW1Aq2vL1vygm02kppi/AiEAyWQ9eAILPXhX +H3a7mEj8z1bCTBiVrhe73NUjim4QcgECIEC3hHRj8ruBwv0eODRSy27CNQTAuJVE +ESKJtfxuZzu1AiEAotXYFbahW/x3hUs9d25ca1EdHOYr8G3kSjRT3lQMHAECIHBl +uX+Ywc1jjWhc+vN2ZrLWkKMVbrd+SWOPUQGroM0j +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICKzCCAdWgAwIBAgIJAO4x/m+tHX8HMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMDYxMjA0MDMxMzUwWhcNMDcwMTAzMDMxMzUwWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKIc +649Amif6weq+c8rVtS7jyn7E9oZ9Irrl9WviQZi0+J2OLgCiPNaj/FzPhTIgBBRF +EP0ZU5DfVv6CoXKbpr8CAwEAAaOBpzCBpDAdBgNVHQ4EFgQUiGz2I+bks0nCHyCI +IwuV3DpDPMwwdQYDVR0jBG4wbIAUiGz2I+bks0nCHyCIIwuV3DpDPMyhSaRHMEUx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGSCCQDuMf5vrR1/BzAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBBQUAA0EAkjFYcs9rrpdURlBaNlbud68VlA5rU+Bv4keYx41DUmqo +sXtkQZENR9iYYYhOUso1/1dwQgrt3egjTZTtq7o5zw== +-----END CERTIFICATE----- diff --git a/regress/scripts/do_sed b/regress/scripts/do_sed new file mode 100755 index 0000000000..31368c720f --- /dev/null +++ b/regress/scripts/do_sed @@ -0,0 +1,102 @@ +#!/bin/sh +# +cwd=`pwd` +. ${cwd}/config +mkdir -p ${cwd}/bin +out="${cwd}/tmp/sed_tmp" + +# set the ports used by these tests +dirport=${BASEPORT} +fdport=`expr ${BASEPORT} '+' 1` +sdport=`expr ${BASEPORT} '+' 2` + +# Create sed command script +echo "s%@sbindir@%${cwd}/bin%g" >${out} +echo "s%@scriptdir@%${cwd}/bin%g" >>${out} +echo "s%@working_dir@%${cwd}/working%g" >>${out} +echo "s%@piddir@%${cwd}/working%g" >>${out} +echo "s%@subsysdir@%${cwd}/working%g" >>${out} +echo "s%@job_email@%${EMAIL}%g" >>${out} +echo "s%@tape_drive@%${TAPE_DRIVE}%g" >>${out} +echo "s%@autochanger@%${AUTOCHANGER}%g" >>${out} +echo "s%@tmpdir@%${cwd}/tmp%g" >>${out} +echo "s%@hostname@%${HOST}%g" >>${out} +echo "s%@changer_path@%${AUTOCHANGER_PATH}%g" >>${out} +echo "s%@tape_drive1@%${TAPE_DRIVE1}%g" >>${out} +echo "s%@smtp_host@%${SMTP_HOST}%g" >>${out} +echo "s%@disk_drive@%${cwd}/tmp/disk-changer%g" >>${out} +echo "s%@hostname@%${hostname}%g" >>${out} +echo "s%@hostname1@%${hostname1}%g" >>${out} +echo "s%@hostname2@%${hostname2}%g" >>${out} +echo "s%@hostname3@%${hostname3}%g" >>${out} +echo "s%@hostname1_files@%${hostname1_files}%g" >>${out} +echo "s%@hostname_files@%${hostname_files}%g" >>${out} +echo "s%@hostname2_files@%${hostname2_files}%g" >>${out} +echo "s%@hostname3_files@%${hostname3_files}%g" >>${out} +echo "s%@hostname1_password@%${hostname1_password}%g" >>${out} +echo "s%@hostname2_password@%${hostname2_password}%g" >>${out} +echo "s%@hostname3_password@%${hostname3_password}%g" >>${out} +echo "s%@dirport@%${dirport}%g" >>${out} +echo "s%@sdport@%${sdport}%g" >>${out} +echo "s%@fdport@%${fdport}%g" >>${out} + +# process .in files with sed script +sed -f ${out} ${cwd}/scripts/bacula-dir.conf.errors.in >${cwd}/scripts/bacula-dir.conf.errors +sed -f ${out} ${cwd}/scripts/test-bacula-dir.conf.in >${cwd}/scripts/test-bacula-dir.conf +sed -f ${out} ${cwd}/scripts/multi-client-bacula-dir.conf.in >${cwd}/scripts/multi-client-bacula-dir.conf +sed -f ${out} ${cwd}/scripts/bacula-dir.conf.regexwhere.in >${cwd}/scripts/bacula-dir.conf.regexwhere +sed -f ${out} ${cwd}/scripts/bacula-dir.conf.maxtime.in >${cwd}/scripts/bacula-dir.conf.maxtime +sed -f ${out} ${cwd}/scripts/new-test-bacula-dir.conf.in >${cwd}/scripts/new-test-bacula-dir.conf +sed -f ${out} ${cwd}/scripts/testa-bacula-dir.conf.in >${cwd}/scripts/testa-bacula-dir.conf +sed -f ${out} ${cwd}/scripts/testb-bacula-dir.conf.in >${cwd}/scripts/testb-bacula-dir.conf +sed -f ${out} ${cwd}/scripts/test-bacula-fd.conf.in >${cwd}/scripts/test-bacula-fd.conf +sed -f ${out} ${cwd}/scripts/test-bacula-sd.conf.in >${cwd}/scripts/test-bacula-sd.conf +sed -f ${out} ${cwd}/scripts/test-console.conf.in >${cwd}/scripts/test-console.conf +sed -f ${out} ${cwd}/scripts/crypto-bacula-fd.conf.in >${cwd}/scripts/crypto-bacula-fd.conf +sed -f ${out} ${cwd}/scripts/bacula-dir-tape.conf.in >${cwd}/scripts/bacula-dir-tape.conf +sed -f ${out} ${cwd}/scripts/bacula-dir-fifo.conf.in >${cwd}/scripts/bacula-dir-fifo.conf +sed -f ${out} ${cwd}/scripts/bacula-dir-migration.conf.in >${cwd}/scripts/bacula-dir-migration.conf +sed -f ${out} ${cwd}/scripts/win32-bacula-dir-tape.conf.in >${cwd}/scripts/win32-bacula-dir-tape.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-tape.conf.in >${cwd}/scripts/bacula-sd-tape.conf +sed -f ${out} ${cwd}/scripts/ansi-sd-tape.conf.in >${cwd}/scripts/ansi-sd-tape.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-fifo.conf.in >${cwd}/scripts/bacula-sd-fifo.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-2tape.conf.in >${cwd}/scripts/bacula-sd-2tape.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-migration.conf.in >${cwd}/scripts/bacula-sd-migration.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-2disk.conf.in >${cwd}/scripts/bacula-sd-2disk.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-2drive.conf.in >${cwd}/scripts/bacula-sd-2drive.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-2disk-drive.conf.in >${cwd}/scripts/bacula-sd-2disk-drive.conf +sed -f ${out} ${cwd}/scripts/cleanup-tape.in >${cwd}/scripts/cleanup-tape +sed -f ${out} ${cwd}/scripts/cleanup-2tape.in >${cwd}/scripts/cleanup-2tape +sed -f ${out} ${cwd}/scripts/cleanup-2drive.in >${cwd}/scripts/cleanup-2drive +sed -f ${out} ${cwd}/scripts/prepare-two-tapes.in >${cwd}/scripts/prepare-two-tapes +sed -f ${out} ${cwd}/scripts/bacula-dir.conf.testrunscript.in >${cwd}/scripts/bacula-dir.conf.testrunscript + +sed -f ${out} ${cwd}/scripts/tls-bacula-fd.conf.in >${cwd}/scripts/tls-bacula-fd.conf +sed -f ${out} ${cwd}/scripts/tls-bacula-sd.conf.in >${cwd}/scripts/tls-bacula-sd.conf +sed -f ${out} ${cwd}/scripts/tls-bacula-dir.conf.in >${cwd}/scripts/tls-bacula-dir.conf + +sed -f ${out} ${cwd}/scripts/bacula-fd-2d.conf.in >${cwd}/scripts/bacula-fd-2d.conf +sed -f ${out} ${cwd}/scripts/bacula-sd-2d.conf.in >${cwd}/scripts/bacula-sd-2d.conf +sed -f ${out} ${cwd}/scripts/bacula-dir-2d.conf.in >${cwd}/scripts/bacula-dir-2d.conf +sed -f ${out} ${cwd}/scripts/bconsole-2d.conf.in >${cwd}/scripts/bconsole-2d.conf + +# These files have no fancy sed stuff, so we just copy them over +cp scripts/win32-bacula-sd-tape.conf.in scripts/win32-bacula-sd-tape.conf +cp scripts/win32-bacula-fd.conf.in scripts/win32-bacula-fd.conf + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/bac$$ +sed s%/tmp%${cwd}/tmp%g ${cwd}/tmp/bac$$ >${cwd}/bin/bacula-sd.conf +chmod 777 ${cwd}/scripts/cleanup-*tape ${cwd}/scripts/cleanup-*drive ${cwd}/scripts/prepare-two-tapes +rm -f ${cwd}/tmp/bac$$ +cp ${cwd}/bin/mtx-changer ${cwd}/tmp/bac$$ +sed "s%^MTX.*$%MTX=${AUTOCHANGER_PATH}%g" ${cwd}/tmp/bac$$ >${cwd}/bin/mtx-changer +chmod 777 ${cwd}/bin/mtx-changer + +# get proper SD tape definitions +cp -f ${cwd}/scripts/linux_tape_options ${cwd}/bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f ${cwd}/scripts/freebsd_tape_options ${cwd}/bin/tape_options +fi + +rm -f ${out} +rm -f ${cwd}/tmp/bac$$ diff --git a/regress/scripts/exclude-dev-test b/regress/scripts/exclude-dev-test new file mode 100644 index 0000000000..4165ea1ae7 --- /dev/null +++ b/regress/scripts/exclude-dev-test @@ -0,0 +1,5 @@ +dev/ptmx +dev/pts +dev/rd/c5d2 +dev/rd +dev/shm diff --git a/regress/scripts/exclude-etc-test b/regress/scripts/exclude-etc-test new file mode 100644 index 0000000000..f59ca8df2a --- /dev/null +++ b/regress/scripts/exclude-etc-test @@ -0,0 +1 @@ +etc/mail/statistics diff --git a/regress/scripts/exclude-lib-test b/regress/scripts/exclude-lib-test new file mode 100644 index 0000000000..5be32f443b --- /dev/null +++ b/regress/scripts/exclude-lib-test @@ -0,0 +1,5 @@ +lib/ld-2.2.5.so +lib/libtermcap.so.2.0.8 +lib/libc-2.2.5.so +lib/libnsl-2.2.5.so +lib/libnss_files-2.2.5.so diff --git a/regress/scripts/flist b/regress/scripts/flist new file mode 100644 index 0000000000..d33e45a88b --- /dev/null +++ b/regress/scripts/flist @@ -0,0 +1,23 @@ +/build/configure +/build/src/stored/bextract +/build/src/tools/testfind +/build/Makefile.in +/build/src/dird/bacula-dir +/build/src/console/bconsole +/build/src/filed/bacula-fd +/build/src/findlib/find_one.c +/build/src/jcr.h +/build/platforms/Makefile.in +/build/platforms/redhat/Makefile.in +/build/scripts/Makefile.in +/build/src/win32/filed/service.cpp +/build/src/filed/restore.c +/build/autoconf/configure.in +/build/examples/afs-bacula +/build/src/win32/Makefile.inc.in +/build/src/win32/installer/winbacula.nsi +/build/autoconf/configure.in +/build/src/version.h +/build/src/lib/message.c +/build/src/lib/bnet_server.c +/build/src/lib/libbac.a diff --git a/regress/scripts/freebsd_tape_options b/regress/scripts/freebsd_tape_options new file mode 100644 index 0000000000..05be3449c4 --- /dev/null +++ b/regress/scripts/freebsd_tape_options @@ -0,0 +1,8 @@ +# +# FreeBSD tape drive options +# +Hardware End of Medium = no +Fast Forward Space File = no +BSF at EOM = yes +Backward Space Record = no +TWO EOF = yes diff --git a/regress/scripts/functions b/regress/scripts/functions new file mode 100644 index 0000000000..798bc0a786 --- /dev/null +++ b/regress/scripts/functions @@ -0,0 +1,204 @@ +# +# A set of useful functions to be sourced in each test +# + +start_test() +{ + echo " " + echo " " + echo " === Starting $TestName at `date +%R:%S` ===" + echo " === Starting $TestName at `date +%R:%S` ===" >>working/log + echo " " + export zstat +} + +require_root() +{ +MUID=`/usr/bin/id | awk -F= '{print $2}' | awk -F\( '{print $1}'` +if [ $MUID != 0 ] ; then + echo " " + echo "You must be root to run this test." + echo " ===== !!!! $TestName not run at `date +%R:%S` ===" + echo " ===== !!!! $TestName not run at `date +%R:%S` !!!! ===== " >>test.out + echo " " + exit 1 +fi +} + + +set_debug() +{ + debug=$1 + if test "$debug" -eq 1 ; then + out="tee" + else + out="output" + fi +} + +run_bacula() +{ + debug_wait + zstat=0 + if test "$debug" -eq 1 ; then + bin/bacula-ctl-sd start + bin/bacula-ctl-fd start + bin/bacula-ctl-dir start + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf + else + bin/bacula start 2>&1 >/dev/null + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null + fi +} + +run_bconsole() +{ + if test "$debug" -eq 1 ; then + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf + else + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null + fi +} + +run_btape() +{ + if test "$debug" -eq 1 ; then + cat tmp/bconcmds | bin/btape -c bin/bacula-sd.conf DDS-4 | tee tmp/log1.out + else + cat tmp/bconcmds | bin/btape -c bin/bacula-sd.conf DDS-4 2>&1 >tmp/log1.out + fi +} + +run_bscan() +{ + if test "$debug" -eq 1 ; then + bin/bscan $* | tee tmp/log.out + else + bin/bscan $* 2>&1 >/dev/null + fi +} + + +stop_bacula() +{ + bin/bacula stop 2>&1 >/dev/null +} + +check_for_zombie_jobs() +{ + scripts/check_for_zombie_jobs $* +} + +change_jobname() +{ + if test $# -eq 1; then + oldname=NightlySave + newname=$1 + else + oldname=$1 + newname=$2 + fi + rm -f bin/1 + mv bin/bacula-dir.conf bin/1 + echo "s%${oldname}%${newname}%g" >tmp/1 + sed -f tmp/1 bin/1 >bin/bacula-dir.conf +# echo "Job ${oldname} changed to ${newname}" +} + +check_two_logs() +{ + grep "^ Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null + bstat=$? + grep "^ Termination: .*Backup Error" tmp/log1.out 2>&1 >/dev/null + if test $? -eq 0; then + bstat=2 + fi + grep "^ Termination: *Restore OK" tmp/log2.out 2>&1 >/dev/null + rstat=$? + grep "^ Termination: *Restore OK -- warning file count mismatch" tmp/log2.out 2>&1 >/dev/null + if test $? -eq 0; then + rstat=2 + fi + grep "^ Termination: .*Verify Differences" tmp/log2.out 2>&1 >/dev/null + if test $? -eq 0; then + rstat=3 + fi +} + +check_restore_diff() +{ + diff -r build tmp/bacula-restores${cwd}/build 2>&1 >/dev/null + dstat=$? +} + +check_restore_tmp_build_diff() +{ + diff -r tmp/build tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null + dstat=$? +} + +end_test() +{ + if [ $zstat != 0 ] ; then + echo " " + echo " !!!!! $TestName failed!!! `date +%R:%S` !!!!! " + echo " !!!!! $TestName failed!!! `date +%R:%S` !!!!! " >>test.out + echo " Status: zombie=$zstat backup=$bstat restore=$rstat diff=$dstat" >>test.out + echo " " + exit 1 + fi + if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then + echo " " + echo " " + echo " !!!!! $TestName failed!!! `date +%R:%S` !!!!! " + echo " !!!!! $TestName failed!!! `date +%R:%S` !!!!! " >>test.out + if [ $bstat != 0 -o $rstat != 0 ] ; then + echo " !!!!! Bad termination status !!!!! " + echo " !!!!! Bad termination status !!!!! " >>test.out + else + echo " !!!!! Restored files differ !!!!! " + echo " !!!!! Restored files differ !!!!! " >>test.out + fi + echo " Status: backup=$bstat restore=$rstat diff=$dstat" + echo " Status: backup=$bstat restore=$rstat diff=$dstat" >>test.out + echo " " + exit 1 + else + echo " ===== $TestName OK `date +%R:%S` ===== " + echo " ===== $TestName OK `date +%R:%S` ===== " >>test.out + if test "$debug" -eq 0 ; then + scripts/cleanup + fi + fi +} + +copy_tape_confs() +{ + scripts/copy-tape-confs + scripts/cleanup-tape +} + +copy_test_confs() +{ + scripts/copy-test-confs + scripts/cleanup +} + +debug_wait() +{ + if test "x${REGRESS_WAIT}" = "x1"; then + echo "Start Bacula under debugger and enter anything when ready ..." + read a + fi +} + +# Save current directory +cwd=`pwd` +if test "x${REGRESS_DEBUG}" = "x1"; then + set_debug 1 +else + set_debug 0 +fi + +# Source the configuration variables +. ${cwd}/config diff --git a/regress/scripts/linux_osst_tape_options b/regress/scripts/linux_osst_tape_options new file mode 100644 index 0000000000..5def0c08cb --- /dev/null +++ b/regress/scripts/linux_osst_tape_options @@ -0,0 +1,7 @@ + Minimum Block Size = 32768 + Maximum Block Size = 32768 + Hardware End of Medium = yes + BSF at EOM = yes + Fast Forward Space File = yes + Two EOF = no + diff --git a/regress/scripts/linux_tape_options b/regress/scripts/linux_tape_options new file mode 100644 index 0000000000..601eb82aa5 --- /dev/null +++ b/regress/scripts/linux_tape_options @@ -0,0 +1 @@ +# nothing needed for Linux diff --git a/regress/scripts/master2048.cert b/regress/scripts/master2048.cert new file mode 100644 index 0000000000..1927c2ee21 --- /dev/null +++ b/regress/scripts/master2048.cert @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIExzCCA6+gAwIBAgIJANItYfYlLjH/MA0GCSqGSIb3DQEBBQUAMIGdMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCTlkxEzARBgNVBAcTCkJpbmdoYW10b24xJTAjBgNV +BAoTHEdpYW50IE1hcmtldCBCaW5naGFtdG9uIEluYy4xHTAbBgNVBAMTFEJhY3Vs +YSBCYWNrdXAgU3lzdGVtMSYwJAYJKoZIhvcNAQkBFhdiYWNrdXBAZ2lhbnRtYXJr +ZXRzLmNvbTAeFw0wNzA0MjUyMDMxNTFaFw0wNzA1MjUyMDMxNTFaMIGdMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCTlkxEzARBgNVBAcTCkJpbmdoYW10b24xJTAjBgNV +BAoTHEdpYW50IE1hcmtldCBCaW5naGFtdG9uIEluYy4xHTAbBgNVBAMTFEJhY3Vs +YSBCYWNrdXAgU3lzdGVtMSYwJAYJKoZIhvcNAQkBFhdiYWNrdXBAZ2lhbnRtYXJr +ZXRzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPbvxVmZErPu +LsvVe2zi31Mygq4pbEVTUi2K6T9kNTC1mmPhPxZJF3vCLQ6/tMKXoc6Wy0cLEs9o +JM9dFu1oVexkLK0oi7nWlYlwg0ua4dADUS0iUIsxPh8f/jXGaaPFcof5f/bwHCwK +Y6GPAdE7oBaPrDip5WCsdhA9lLGcmZBKeabemDfHyrfaLmrzRt3ZXH3dMa2ROC2A +YIo0ReFaklNCJDxLojbG0BezW6F4IbfsQSelr6g72io88oBEAa0aysOGRKdaQ4Da +18aVsFfbLQ6z/DAAu66HgQJG9X5bWsew3aUVThKIICtXoI8FMSgk+yZHKpzj+K6o +KiZ+bMcRemsCAwEAAaOCAQYwggECMB0GA1UdDgQWBBSi7vn39ZcGIbzV3y6zvR0V +T2zK/DCB0gYDVR0jBIHKMIHHgBSi7vn39ZcGIbzV3y6zvR0VT2zK/KGBo6SBoDCB +nTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAk5ZMRMwEQYDVQQHEwpCaW5naGFtdG9u +MSUwIwYDVQQKExxHaWFudCBNYXJrZXQgQmluZ2hhbXRvbiBJbmMuMR0wGwYDVQQD +ExRCYWN1bGEgQmFja3VwIFN5c3RlbTEmMCQGCSqGSIb3DQEJARYXYmFja3VwQGdp +YW50bWFya2V0cy5jb22CCQDSLWH2JS4x/zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3 +DQEBBQUAA4IBAQAnek7pGLAehonnbSIkB8XD27l2EU73sYEMCm6YI5U5fyCsYN40 +KkYm32jhZu15xR+uuiYZWJqzZqz0O5xrK4Rxc36KAD5FMeYEoIDjdK1hXnrA2Jvo +w7wlhQJ/JDp/gGV0yDCZe2jURlVDR/YT1ECnIUZ9jr2GX6w2Uwk1iJedvbKRlHyc +PxEHpTGXl6YrmlVIpcNIuuHn4dY1FBul2VSC4RAhwmXvNSQDnQoQodX5QaJN1uc8 +tsU3lBtsSsKzerBFyKujwi8I0qcOtzHqy/zYbr3F4uHTSVheCja4FWskrRWCMQzc +ySn09DurGBHU+iixlOsLy9xKwytntJPZqXV6 +-----END CERTIFICATE----- \ No newline at end of file diff --git a/regress/scripts/multi-client-bacula-dir.conf.in b/regress/scripts/multi-client-bacula-dir.conf.in new file mode 100644 index 0000000000..a8a2efec2e --- /dev/null +++ b/regress/scripts/multi-client-bacula-dir.conf.in @@ -0,0 +1,376 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 2.2.2 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 10 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 10 +} + +Job { + Name = @hostname1@ + Type = Backup + Client = @hostname1@-fd + FileSet = "@hostname1@-FileSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 10 +} + +Job { + Name = @hostname2@ + Type = Backup + Client = @hostname2@-fd + FileSet = "@hostname2@-FileSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 10 +} + +Job { + Name = @hostname3@ + Type = Backup + Client = @hostname3@-fd + FileSet = "@hostname3@-FileSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 10 +} + + + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 10 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +# Max Run Time = 15 seconds +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u regress" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = @hostname_files@ + } +} + +FileSet { + Name = "@hostname1@-FileSet" + Include { Options { signature=MD5 } + File = @hostname1_files@ + } +} + +FileSet { + Name = "@hostname2@-FileSet" + Include { Options { signature=MD5 } + File = @hostname2_files@ + } +} + +FileSet { + Name = "@hostname3@-FileSet" + Include { Options { signature=MD5 } + File = @hostname3_files@ + } +} + +FileSet { + Name = "SparseSet" + Include { Options { signature=MD5; sparse=yes } + File=<@tmpdir@/file-list + } +} + +FileSet { + Name = "CompressedSet" + Include { + Options { signature=MD5; compression=GZIP } + File =<@tmpdir@/file-list + } +} + +FileSet { + Name = "SparseCompressedSet" + Include { + Options { + signature=MD5; compression=GZIP + } + File= <@tmpdir@/file-list + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Level=Full 1st sun at 1:05 + Run = Level=Differential 2nd-5th sun at 1:05 + Run = Level=Incremental mon-sat at 1:05 +} + +# This schedule does the catalog. It starts after the WeeklyCycle +Schedule { + Name = "WeeklyCycleAfterBackup" + Run = Level=Full sun-sat at 1:10 +} + +# This is the backup of the catalog +FileSet { + Name = "Catalog" + Include { Options { signature=MD5 } + File=/home/kern/bacula/regress/bin/working/bacula.sql + } +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 10 +} + +Client { + Name = @hostname1@-fd + Address = @hostname1@ + FDPort = 9102 + Catalog = MyCatalog + Password = "@hostname1_password@" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 10 +} + +Client { + Name = @hostname2@-fd + Address = @hostname2@ + FDPort = 9102 + Catalog = MyCatalog + Password = "@hostname2_password@" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 10 +} + +Client { + Name = @hostname3@-fd + Address = @hostname3@ + FDPort = 9102 + Catalog = MyCatalog + Password = "@hostname3_password@" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 10 +} + + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 10 +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 + Maximum Concurrent Jobs = 10 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/new-test-bacula-dir.conf.in b/regress/scripts/new-test-bacula-dir.conf.in new file mode 100644 index 0000000000..f10344215f --- /dev/null +++ b/regress/scripts/new-test-bacula-dir.conf.in @@ -0,0 +1,368 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39 or later +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 4 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "FIFOTest" + Type = Backup + Client=@hostname@-fd + FileSet="FIFOSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + ClientRunBeforeJob = "/bin/sleep 60" +} + + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u regress" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +JobDefs { + Name = "BackupJob" + Type = Backup + Pool = Default + Storage = File + Messages = Standard + Priority = 10 +} + +Job { + JobDefs = "BackupJob" + Name = "bug621-job-1" + Client = @hostname@-fd + FileSet="Full Set" + ClientRunBeforeJob = "/bin/sleep 60" +} + +Job { + JobDefs = "BackupJob" + Name = "bug621-job-2" + Client = @hostname@-fd + FileSet = "Full Set" + Max Run Time = 30 + Priority = 15 +} + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "SparseSet" + Include { + Options { + signature=MD5 + sparse=yes + } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "CompressedSet" + Include { + Options { + signature=MD5 + compression=GZIP + } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "FIFOSet" + Include { + Options { + readfifo = yes + signature=MD5 + } + File = <@tmpdir@/file-list + } +} + + +FileSet { + Name = "SparseCompressedSet" + Include { + Options { + signature=MD5 + compression=GZIP + sparse=yes + } + File = <@tmpdir@/file-list + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Level=Full 1st sun at 1:05 + Run = Level=Differential 2nd-5th sun at 1:05 + Run = Level=Incremental mon-sat at 1:05 +} + +# This schedule does the catalog. It starts after the WeeklyCycle +Schedule { + Name = "WeeklyCycleAfterBackup" + Run = Level=Full sun-sat at 1:10 +} + +# This is the backup of the catalog +FileSet { + Name = "Catalog" + Include { + Options { + signature=MD5 + } + File = /home/kern/bacula/regress/bin/working/bacula.sql + } +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 + Maximum Concurrent Jobs = 4 +} + + +# Definition of DLT tape storage device +#Storage { +# Name = DLTDrive +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = "HP DLT 80" # must be same as Device in Storage daemon +# Media Type = DLT8000 # must be same as MediaType in Storage daemon +#} + +# Definition of DDS tape storage device +#Storage { +# Name = SDT-10000 +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = SDT-10000 # must be same as Device in Storage daemon +# Media Type = DDS-4 # must be same as MediaType in Storage daemon +#} + +# Definition of 8mm tape storage device +#Storage { +# Name = "8mmDrive" +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +# Device = "Exabyte 8mm" +# MediaType = "8mm" +#} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +# Label Format = "TEST-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}:${NumVols}" +# Maximum Volume Jobs = 1 +} diff --git a/regress/scripts/prepare-two-disks b/regress/scripts/prepare-two-disks new file mode 100755 index 0000000000..959daa4201 --- /dev/null +++ b/regress/scripts/prepare-two-disks @@ -0,0 +1,6 @@ +#!/bin/sh +# +# Create fresh virtual disk changer directory +# +rm -rf tmp/disk-changer +mkdir tmp/disk-changer diff --git a/regress/scripts/prepare-two-tapes.in b/regress/scripts/prepare-two-tapes.in new file mode 100755 index 0000000000..611fb906f7 --- /dev/null +++ b/regress/scripts/prepare-two-tapes.in @@ -0,0 +1,41 @@ +#!/bin/sh +# +# Create two blank tapes +# +OS=`uname` +case ${OS} in + SunOS) + ready="No Additional Sense" + ;; + FreeBSD) + ready="Current Driver State: at rest." + ;; + *) + ready="ONLINE" + ;; +esac +wait_for_drive() { + i=0 + while [ $i -le 300 ]; do # Wait max 300 seconds + if mt -f $1 status | grep ${ready} >/dev/null 2>&1; then + break + fi +# debug "Device $1 - not ready, retrying..." + sleep 1 + i=`expr $i + 1` + done +} + +# +# mt -f @tape_drive@ offline +@changer_path@ -f @autochanger@ unload +@changer_path@ -f @autochanger@ load 1 +wait_for_drive @tape_drive@ +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof +@changer_path@ -f @autochanger@ unload +@changer_path@ -f @autochanger@ load 2 +wait_for_drive @tape_drive@ +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof +#@changer_path@ -f @autochanger@ unload diff --git a/regress/scripts/regress-config b/regress/scripts/regress-config new file mode 100755 index 0000000000..8d3abd6f9d --- /dev/null +++ b/regress/scripts/regress-config @@ -0,0 +1,29 @@ +#!/bin/sh +# +# This is the configuration script for regression testing +# + +. ${1}/config + +CFLAGS="-g -O2 -Wall" \ + ./configure \ + --sbindir=${1}/bin \ + --archivedir=${1}/tmp \ + --sysconfdir=${1}/bin \ + --mandir=${1}/bin \ + --with-pid-dir=${1}/working \ + --with-subsys-dir=${1}/working \ + --enable-smartalloc \ + --disable-readline \ + --with-working-dir=${1}/working \ + --with-dump-email=${EMAIL} \ + --with-job-email=${EMAIL} \ + --with-smtp-host=${SMTP_HOST} \ + --with-db-name=regress \ + --with-db-user=regress \ + ${OPENSSL} \ + ${TCPWRAPPERS} \ + ${WHICHDB} \ + --with-baseport=8101 + +exit 0 diff --git a/regress/scripts/setup b/regress/scripts/setup new file mode 100755 index 0000000000..e452fa1f01 --- /dev/null +++ b/regress/scripts/setup @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Script to setup running Bacula regression tests +# + +check_exit_code() +{ + if [ $? != 0 ] ; then + echo "Bad exit code giving up" + exit 1 + fi +} + +. ./config + +cwd=`pwd` +if [ ! -d ${BACULA_SOURCE} ] ; then + echo "The BACULA_SOURCE environment variable must be a Bacula release directory, but is not." + echo " " + exit 1 +fi +rm -rf build bin +# Copy new source +echo "Copying source from ${BACULA_SOURCE}" +cp -rp ${BACULA_SOURCE} build +cp scripts/regress-config build +cd build +rm -f Makefile config.cache +# Run Bacula configuration, make, install +./regress-config ${cwd} +check_exit_code +# Cleanup any win32 build in source +cd src/win32 +make clean +cd ../.. +make +check_exit_code +make install +check_exit_code +cp src/tools/testls ../bin +check_exit_code + +cd ${cwd} +bin/bacula stop + +mkdir -p working +cd bin +echo "Running database creation scripts" +./create_bacula_database +./drop_bacula_tables +./make_bacula_tables +./grant_bacula_privileges +cd ${cwd} +# Start and stop Bacula to ensure conf files are OK +bin/bacula start +bin/bacula stop +# +# Save Bacula default conf files for later use +# +cp -f bin/*.conf scripts diff --git a/regress/scripts/test-bacula-dir.conf.in b/regress/scripts/test-bacula-dir.conf.in new file mode 100644 index 0000000000..6a6defeca2 --- /dev/null +++ b/regress/scripts/test-bacula-dir.conf.in @@ -0,0 +1,312 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 2.2.2 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 4 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +# Max Run Time = 15 seconds +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u regress" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "SparseSet" + Include { Options { signature=MD5; sparse=yes } + File=<@tmpdir@/file-list + } +} + +FileSet { + Name = "CompressedSet" + Include { + Options { signature=MD5; compression=GZIP } + File =<@tmpdir@/file-list + } +} + +FileSet { + Name = "SparseCompressedSet" + Include { + Options { + signature=MD5; compression=GZIP + } + File= <@tmpdir@/file-list + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Level=Full 1st sun at 1:05 + Run = Level=Differential 2nd-5th sun at 1:05 + Run = Level=Incremental mon-sat at 1:05 +} + +# This schedule does the catalog. It starts after the WeeklyCycle +Schedule { + Name = "WeeklyCycleAfterBackup" + Run = Level=Full sun-sat at 1:10 +} + +# This is the backup of the catalog +FileSet { + Name = "Catalog" + Include { Options { signature=MD5 } + File=/home/kern/bacula/regress/bin/working/bacula.sql + } +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 + Maximum Concurrent Jobs = 4 +} + + +# Definition of DLT tape storage device +#Storage { +# Name = DLTDrive +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = "HP DLT 80" # must be same as Device in Storage daemon +# Media Type = DLT8000 # must be same as MediaType in Storage daemon +#} + +# Definition of DDS tape storage device +#Storage { +# Name = SDT-10000 +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = SDT-10000 # must be same as Device in Storage daemon +# Media Type = DDS-4 # must be same as MediaType in Storage daemon +#} + +# Definition of 8mm tape storage device +#Storage { +# Name = "8mmDrive" +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +# Device = "Exabyte 8mm" +# MediaType = "8mm" +#} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/test-bacula-fd.conf.in b/regress/scripts/test-bacula-fd.conf.in new file mode 100644 index 0000000000..47c44998da --- /dev/null +++ b/regress/scripts/test-bacula-fd.conf.in @@ -0,0 +1,33 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 1.33 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = @hostname@-dir + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = @hostname@-fd + FDPort = @fdport@ # where we listen for the director + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + SubSys Directory = "@subsysdir@" +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/test-bacula-sd.conf.in b/regress/scripts/test-bacula-sd.conf.in new file mode 100644 index 0000000000..7bb3b89dbe --- /dev/null +++ b/regress/scripts/test-bacula-sd.conf.in @@ -0,0 +1,107 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = FileStorage + Media Type = File + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabelled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +# Maximum File Size = 10KB +} + +Device { + Name = FileStorage1 + Media Type = File1 + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabelled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +} + + +#Device { +# Name = "HP DLT 80" +# Media Type = DLT8000 +# Archive Device = /dev/nst0 +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = yes; +# RemovableMedia = yes; +#} + +#Device { +# Name = SDT-7000 # +# Media Type = DDS-2 +# Archive Device = /dev/nst0 +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = yes; +# RemovableMedia = yes; +#} + +#Device { +# Name = Floppy +# Media Type = Floppy +# Archive Device = /mnt/floppy +# RemovableMedia = yes; +# Random Access = Yes; +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = no; +#} + +# +# A very old Exabyte with no end of media detection +# +#Device { +# Name = "Exabyte 8mm" +# Media Type = "8mm" +# Archive Device = /dev/nst0 +# Hardware end of medium = No; +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = Yes; +# RemovableMedia = yes; +#} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/test-console.conf.in b/regress/scripts/test-console.conf.in new file mode 100644 index 0000000000..4211bcf138 --- /dev/null +++ b/regress/scripts/test-console.conf.in @@ -0,0 +1,10 @@ +# +# Bacula User Agent (or Console) Configuration File +# + +Director { + Name = @hostname@-dir + DIRPort = @dirport@ + address = @hostname@ + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" +} diff --git a/regress/scripts/testa-bacula-dir.conf.in b/regress/scripts/testa-bacula-dir.conf.in new file mode 100644 index 0000000000..ea19edc90d --- /dev/null +++ b/regress/scripts/testa-bacula-dir.conf.in @@ -0,0 +1,147 @@ +# +# TestA Bacula Director Configuration file +# +# For Bacula release 1.30 (12 April 2003) -- redhat 7.3 +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 1 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + + +Job { + Name = "MultiVol" + Type = Backup + Client=@hostname@-fd + Level = Full + FileSet="Full Set" + Storage = File + Messages = Standard + Write Bootstrap = "@working_dir@/SmallVols.bsr" + Pool = SmallVols + SpoolData = yes +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=SHA1 } + File =<@tmpdir@/file-list + } +} + + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate + + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate, !restored + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = SmallVols + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + Maximum Volumes = 10 + MaximumVolumeBytes = 10M + LabelFormat = Small +} diff --git a/regress/scripts/testb-bacula-dir.conf.in b/regress/scripts/testb-bacula-dir.conf.in new file mode 100644 index 0000000000..fd046d6922 --- /dev/null +++ b/regress/scripts/testb-bacula-dir.conf.in @@ -0,0 +1,151 @@ +# +# TestA Bacula Director Configuration file +# +# For Bacula release 2.2.x +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 20 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + + +Job { + Name = "MultiVol" + Type = Backup + Client=@hostname@-fd + Level = Full + FileSet="Full Set" + Storage = File + Messages = Standard + Write Bootstrap = "@working_dir@/SmallVols.bsr" + Pool = SmallVols + SpoolData = yes + Maximum Concurrent Jobs = 20 +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=SHA1 } + File =<@tmpdir@/file-list + } +} + + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 20 +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 20 +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 + Maximum Concurrent Jobs = 20 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate + + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate, !restored + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} + +Pool { + Name = SmallVols + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year + Maximum Volumes = 100 + MaximumVolumeBytes = 10M + LabelFormat = Small +} diff --git a/regress/scripts/tls-CA.pem b/regress/scripts/tls-CA.pem new file mode 100644 index 0000000000..dc8d89a319 --- /dev/null +++ b/regress/scripts/tls-CA.pem @@ -0,0 +1,37 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- diff --git a/regress/scripts/tls-bacula-dir.conf.in b/regress/scripts/tls-bacula-dir.conf.in new file mode 100644 index 0000000000..451f8166e2 --- /dev/null +++ b/regress/scripts/tls-bacula-dir.conf.in @@ -0,0 +1,379 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39 or later +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 4 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "FIFOTest" + Type = Backup + Client=@hostname@-fd + FileSet="FIFOSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + ClientRunBeforeJob = "/bin/sleep 60" +} + + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u regress" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +JobDefs { + Name = "BackupJob" + Type = Backup + Pool = Default + Storage = File + Messages = Standard + Priority = 10 +} + +Job { + JobDefs = "BackupJob" + Name = "bug621-job-1" + Client = @hostname@-fd + FileSet="Full Set" + ClientRunBeforeJob = "/bin/sleep 60" +} + +Job { + JobDefs = "BackupJob" + Name = "bug621-job-2" + Client = @hostname@-fd + FileSet = "Full Set" + Max Run Time = 30 + Priority = 15 +} + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "SparseSet" + Include { + Options { + signature=MD5 + sparse=yes + } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "CompressedSet" + Include { + Options { + signature=MD5 + compression=GZIP + } + File = <@tmpdir@/file-list + } +} + +FileSet { + Name = "FIFOSet" + Include { + Options { + readfifo = yes + signature=MD5 + } + File = <@tmpdir@/file-list + } +} + + +FileSet { + Name = "SparseCompressedSet" + Include { + Options { + signature=MD5 + compression=GZIP + sparse=yes + } + File = <@tmpdir@/file-list + } +} + + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Level=Full 1st sun at 1:05 + Run = Level=Differential 2nd-5th sun at 1:05 + Run = Level=Incremental mon-sat at 1:05 +} + +# This schedule does the catalog. It starts after the WeeklyCycle +Schedule { + Name = "WeeklyCycleAfterBackup" + Run = Level=Full sun-sat at 1:10 +} + +# This is the backup of the catalog +FileSet { + Name = "Catalog" + Include { + Options { + signature=MD5 + } + File = /home/kern/bacula/regress/bin/working/bacula.sql + } +} + +# Client (File Services) to backup +Client { + Name = @hostname@-fd + Address = @hostname@ + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" # password for FileDaemon + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +# Definiton of file storage device +Storage { + Name = File + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage + Media Type = File + Maximum Concurrent Jobs = 4 + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +Storage { + Name = File1 + Address = @hostname@ # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + Device = FileStorage1 + Media Type = File1 + Maximum Concurrent Jobs = 4 + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + + +# Definition of DLT tape storage device +#Storage { +# Name = DLTDrive +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = "HP DLT 80" # must be same as Device in Storage daemon +# Media Type = DLT8000 # must be same as MediaType in Storage daemon +#} + +# Definition of DDS tape storage device +#Storage { +# Name = SDT-10000 +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon +# Device = SDT-10000 # must be same as Device in Storage daemon +# Media Type = DDS-4 # must be same as MediaType in Storage daemon +#} + +# Definition of 8mm tape storage device +#Storage { +# Name = "8mmDrive" +# Address = @hostname@ # N.B. Use a fully qualified name here +# SDPort = @sdport@ +# Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +# Device = "Exabyte 8mm" +# MediaType = "8mm" +#} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +Messages { + Name = NoEmail + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + console = all, !skipped, !terminate +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +# Label Format = "TEST-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}:${NumVols}" +} diff --git a/regress/scripts/tls-bacula-fd.conf.in b/regress/scripts/tls-bacula-fd.conf.in new file mode 100644 index 0000000000..c489a0e536 --- /dev/null +++ b/regress/scripts/tls-bacula-fd.conf.in @@ -0,0 +1,41 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 2.0 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = @hostname@-dir + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = @hostname@-fd + FDPort = @fdport@ # where we listen for the director + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + SubSys Directory = "@subsysdir@" + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/tls-bacula-sd.conf.in b/regress/scripts/tls-bacula-sd.conf.in new file mode 100644 index 0000000000..c7fe86d621 --- /dev/null +++ b/regress/scripts/tls-bacula-sd.conf.in @@ -0,0 +1,115 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.33 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = @hostname@-sd + SDPort = @sdport@ # Director's port + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + Subsys Directory = "@subsysdir@" + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = @hostname@-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" + TLS Require = yes + TLS Certificate = "@scriptdir@/tls-cert.pem" + TLS Key = "@scriptdir@/tls-cert.pem" + TLS CA Certificate File = "@scriptdir@/tls-CA.pem" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = FileStorage + Media Type = File + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabelled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +# Maximum File Size = 10KB +} + +Device { + Name = FileStorage1 + Media Type = File1 + Archive Device = @tmpdir@ + LabelMedia = yes; # lets Bacula label unlabelled media + Random Access = Yes; + AutomaticMount = yes; # when device opened, read it + RemovableMedia = no; + AlwaysOpen = no; +} + + +#Device { +# Name = "HP DLT 80" +# Media Type = DLT8000 +# Archive Device = /dev/nst0 +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = yes; +# RemovableMedia = yes; +#} + +#Device { +# Name = SDT-7000 # +# Media Type = DDS-2 +# Archive Device = /dev/nst0 +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = yes; +# RemovableMedia = yes; +#} + +#Device { +# Name = Floppy +# Media Type = Floppy +# Archive Device = /mnt/floppy +# RemovableMedia = yes; +# Random Access = Yes; +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = no; +#} + +# +# A very old Exabyte with no end of media detection +# +#Device { +# Name = "Exabyte 8mm" +# Media Type = "8mm" +# Archive Device = /dev/nst0 +# Hardware end of medium = No; +# AutomaticMount = yes; # when device opened, read it +# AlwaysOpen = Yes; +# RemovableMedia = yes; +#} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/scripts/tls-cert.pem b/regress/scripts/tls-cert.pem new file mode 100644 index 0000000000..18c7ce6376 --- /dev/null +++ b/regress/scripts/tls-cert.pem @@ -0,0 +1,357 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, ST=MA, L=None, O=Bacula, OU=Bacula, CN=Bacula Test CA + Validity + Not Before: Jun 22 19:47:20 2007 GMT + Not After : Jun 19 19:47:20 2017 GMT + Subject: C=US, ST=MA, L=None, O=Bacula, OU=Bacula, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (4096 bit) + Modulus (4096 bit): + 00:a5:f2:48:4b:63:fa:be:37:59:46:14:58:82:32: + fd:af:25:64:58:55:93:c8:0e:b5:45:c5:72:05:14: + 07:80:4d:da:d9:73:66:b1:e8:6c:f0:cf:d6:55:dd: + a1:2d:2e:bb:c8:99:af:6a:99:bd:8d:cd:aa:f6:ca: + b5:64:5c:58:c6:c3:c2:dc:a1:86:7c:b3:b0:ee:da: + f2:a1:3a:c2:a7:1d:83:7b:d7:9a:a8:30:97:fc:c0: + 66:2d:0e:b9:c6:38:d9:91:ff:d9:be:5f:0d:5c:90: + 1c:78:82:bc:65:5b:3a:12:8d:ac:95:a5:cc:f8:f7: + 74:99:0b:95:1b:34:7d:7f:81:ac:75:f2:e7:af:d4: + e6:29:fd:51:2f:c1:42:cc:95:ef:df:79:7b:c8:66: + 30:aa:c9:ba:70:38:cf:b9:68:cf:e6:45:ec:1d:8d: + 6b:a1:a8:f5:93:a7:fb:ae:e9:b0:f6:0f:99:46:27: + aa:d5:7f:24:0f:a9:ac:85:d4:b8:e2:63:e2:dc:4f: + a3:3b:86:f8:3b:61:42:de:58:03:d6:8c:06:e2:f7: + 18:cb:e7:c5:ce:97:88:ac:08:5b:0a:fc:54:af:6a: + a6:dd:9a:94:da:85:bd:06:e9:ec:fe:73:36:9a:bf: + 1d:fb:6e:1b:2a:de:f7:09:33:f8:a8:3d:58:29:44: + f9:a9:1c:0f:58:85:3b:fb:62:aa:be:fc:97:17:82: + 25:c7:5a:d4:71:d6:7f:30:3d:c8:8b:f6:f8:5f:05: + c6:b6:d0:31:ac:a4:ae:47:3c:0e:4d:b4:28:6b:4b: + 3c:a2:01:df:37:bb:18:8c:3b:15:53:fd:d9:0a:a9: + bd:12:59:9c:59:b0:c9:d9:af:1f:2f:19:cf:dd:63: + 42:09:83:fc:98:5c:76:68:bd:af:f5:71:b2:b7:63: + 34:47:ed:89:74:73:fd:e2:33:4e:e6:1d:7e:cb:27: + d2:2a:94:a7:07:d1:5d:e2:b8:73:78:4a:6f:5f:9f: + 9c:9a:d3:fa:4f:4b:b0:19:82:0a:b9:39:62:81:ef: + 7d:9b:0e:ab:69:18:70:33:80:f1:91:87:ba:4a:23: + ba:1b:2a:8b:d0:34:cc:11:e9:b0:d2:73:1d:12:7d: + 3d:a3:3e:86:3c:9c:15:7c:40:92:3f:20:b4:61:d9: + 39:65:a5:c9:e3:6e:de:fe:fe:0e:61:42:2f:cf:93: + 9e:fa:05:06:75:2e:53:11:8e:e4:1c:5f:ad:89:4d: + 60:e3:98:2c:c0:60:83:9d:b2:02:06:62:ff:fe:7b: + de:62:9e:65:f7:e1:ab:03:36:c9:8c:b1:4f:50:6d: + ab:20:78:63:f5:1e:be:db:88:b7:82:bb:34:de:da: + 37:23:8f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Client, SSL Server + Netscape Comment: + TinyCA Generated Certificate + X509v3 Subject Key Identifier: + EC:89:89:35:40:56:8B:D7:59:A6:6B:EA:FF:23:16:3A:C4:15:AA:48 + X509v3 Authority Key Identifier: + keyid:BB:31:0C:AE:8B:1A:84:53:AF:22:C7:35:31:6B:8E:0C:A0:FA:CA:96 + DirName:/C=US/ST=MA/L=None/O=Bacula/OU=Bacula/CN=Bacula Test CA + serial:FB:2D:58:85:23:55:12:1A + + X509v3 Issuer Alternative Name: + + + X509v3 Subject Alternative Name: + + + Signature Algorithm: sha1WithRSAEncryption + 22:f3:34:b8:be:3e:d4:6b:9a:6e:86:d2:e1:bd:72:a8:51:45: + ed:f9:d3:1a:b7:41:81:d1:fa:e8:42:c3:a9:6c:95:7b:1f:3f: + e3:e8:fa:43:25:ee:38:78:52:e0:29:61:50:57:ff:89:32:b8: + e8:83:5d:63:ea:33:f2:7e:d5:8d:42:0d:0f:06:ae:b4:1d:77: + 4c:44:47:17:48:ac:f9:59:0e:4b:d4:e3:28:ca:67:4e:5d:e8: + 76:dd:a6:fc:50:43:46:76:d8:60:fb:84:98:d0:59:99:e7:29: + 2f:c1:8f:4b:4a:32:da:e1:d8:0a:ec:39:62:1f:39:4c:99:8f: + 74:e4:b7:b8:df:c4:0f:5c:5c:8e:3a:2c:0e:72:c2:fd:68:7c: + 44:eb:87:fe:c1:55:2b:b6:ac:8b:f5:45:8c:07:fa:da:80:b5: + 66:51:1c:1b:c9:54:13:45:b5:a9:15:01:c3:16:44:e5:f8:d4: + 58:d6:e8:44:68:ba:4f:c5:fa:ac:cf:06:e0:fc:9b:5f:25:96: + ce:d3:1e:29:5d:97:ce:48:92:3c:e9:93:5a:6c:12:11:63:5d: + f0:78:08:60:06:12:c9:47:cc:77:bb:e6:13:8e:3a:ac:b0:39: + 39:e8:79:ca:fa:14:85:1a:f3:8e:a6:02:17:fb:12:29:d6:d8: + e7:19:dc:35:47:c9:b9:e3:f6:00:a3:04:f9:b0:e4:83:fb:ea: + b5:17:cd:bc:ab:db:bf:88:aa:a7:90:ea:e4:1c:3b:bd:47:ff: + 2d:8b:9b:36:ee:e6:a6:77:95:52:ae:95:02:84:ff:ca:57:f2: + c7:52:d4:68:76:46:44:6d:51:4f:5f:2e:05:d7:fc:8c:6d:8c: + b2:6c:aa:fc:ca:c8:6f:3c:23:b5:fa:a3:11:2b:62:1a:65:a3: + 9d:46:ed:40:5e:e3:a8:3a:85:a8:65:62:05:8d:1c:07:47:6a: + 51:0c:f7:cd:cc:54:6e:4e:74:e0:0b:a7:56:63:fa:8e:bf:5d: + 95:4e:4b:c0:61:64:ee:10:82:75:69:2e:66:81:cc:e3:ec:c9: + aa:e2:5f:03:d6:5b:16:c6:66:20:a4:90:6a:4b:49:04:c3:ec: + 53:03:18:51:17:d7:48:b5:f9:db:8e:1a:e7:7b:7f:0e:83:79: + 5c:36:76:0d:04:54:a7:f2:e9:8f:2e:51:de:79:81:aa:3b:e4: + 48:00:65:33:cf:af:ce:dd:63:81:fa:63:cf:79:0c:6b:45:a3: + 21:0e:ee:4a:ed:27:a8:6a:21:3f:b1:6f:e1:f0:ae:81:6c:dc: + 38:53:9f:2c:b7:d1:65:86:0a:5d:7b:14:38:6c:e2:89:2d:5d: + 22:05:91:41:89:0e:bd:2c +-----BEGIN CERTIFICATE----- +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 +LA== +-----END CERTIFICATE----- +Private-Key: (4096 bit) +modulus: + 00:a5:f2:48:4b:63:fa:be:37:59:46:14:58:82:32: + fd:af:25:64:58:55:93:c8:0e:b5:45:c5:72:05:14: + 07:80:4d:da:d9:73:66:b1:e8:6c:f0:cf:d6:55:dd: + a1:2d:2e:bb:c8:99:af:6a:99:bd:8d:cd:aa:f6:ca: + b5:64:5c:58:c6:c3:c2:dc:a1:86:7c:b3:b0:ee:da: + f2:a1:3a:c2:a7:1d:83:7b:d7:9a:a8:30:97:fc:c0: + 66:2d:0e:b9:c6:38:d9:91:ff:d9:be:5f:0d:5c:90: + 1c:78:82:bc:65:5b:3a:12:8d:ac:95:a5:cc:f8:f7: + 74:99:0b:95:1b:34:7d:7f:81:ac:75:f2:e7:af:d4: + e6:29:fd:51:2f:c1:42:cc:95:ef:df:79:7b:c8:66: + 30:aa:c9:ba:70:38:cf:b9:68:cf:e6:45:ec:1d:8d: + 6b:a1:a8:f5:93:a7:fb:ae:e9:b0:f6:0f:99:46:27: + aa:d5:7f:24:0f:a9:ac:85:d4:b8:e2:63:e2:dc:4f: + a3:3b:86:f8:3b:61:42:de:58:03:d6:8c:06:e2:f7: + 18:cb:e7:c5:ce:97:88:ac:08:5b:0a:fc:54:af:6a: + a6:dd:9a:94:da:85:bd:06:e9:ec:fe:73:36:9a:bf: + 1d:fb:6e:1b:2a:de:f7:09:33:f8:a8:3d:58:29:44: + f9:a9:1c:0f:58:85:3b:fb:62:aa:be:fc:97:17:82: + 25:c7:5a:d4:71:d6:7f:30:3d:c8:8b:f6:f8:5f:05: + c6:b6:d0:31:ac:a4:ae:47:3c:0e:4d:b4:28:6b:4b: + 3c:a2:01:df:37:bb:18:8c:3b:15:53:fd:d9:0a:a9: + bd:12:59:9c:59:b0:c9:d9:af:1f:2f:19:cf:dd:63: + 42:09:83:fc:98:5c:76:68:bd:af:f5:71:b2:b7:63: + 34:47:ed:89:74:73:fd:e2:33:4e:e6:1d:7e:cb:27: + d2:2a:94:a7:07:d1:5d:e2:b8:73:78:4a:6f:5f:9f: + 9c:9a:d3:fa:4f:4b:b0:19:82:0a:b9:39:62:81:ef: + 7d:9b:0e:ab:69:18:70:33:80:f1:91:87:ba:4a:23: + ba:1b:2a:8b:d0:34:cc:11:e9:b0:d2:73:1d:12:7d: + 3d:a3:3e:86:3c:9c:15:7c:40:92:3f:20:b4:61:d9: + 39:65:a5:c9:e3:6e:de:fe:fe:0e:61:42:2f:cf:93: + 9e:fa:05:06:75:2e:53:11:8e:e4:1c:5f:ad:89:4d: + 60:e3:98:2c:c0:60:83:9d:b2:02:06:62:ff:fe:7b: + de:62:9e:65:f7:e1:ab:03:36:c9:8c:b1:4f:50:6d: + ab:20:78:63:f5:1e:be:db:88:b7:82:bb:34:de:da: + 37:23:8f +publicExponent: 65537 (0x10001) +privateExponent: + 21:ff:a0:86:29:a6:ae:a0:02:5f:54:3d:c9:f7:0e: + 78:7a:cd:b3:37:5d:3e:a8:9c:c4:fd:ad:dd:92:7b: + f2:f2:80:7a:fa:a4:b8:a0:68:e9:71:7b:75:3e:22: + 0e:72:bb:b0:5e:a4:4c:cf:d0:c1:23:b8:fa:35:0f: + b2:cf:24:b5:1c:58:69:01:82:df:3b:a5:6d:5a:58: + 49:66:13:89:4f:87:a7:b0:c5:93:dd:d8:d5:c4:c9: + 6a:43:d1:15:e6:81:d4:e2:b9:46:c2:8c:a7:41:33: + 44:11:6c:ed:cb:21:fb:b9:20:f9:cb:ed:51:b8:c9: + 1f:ad:fa:cf:87:12:8b:34:13:14:5b:3e:d2:8c:68: + d7:83:79:c5:b1:ef:b0:a0:ab:73:7a:9d:3c:b2:8b: + 18:02:9a:7a:f1:78:c5:80:ce:cf:5b:d6:03:3b:fd: + 28:32:c8:95:86:de:0e:b8:fc:33:7d:80:a6:99:eb: + eb:2f:d0:40:91:3f:b2:6f:a1:ad:68:4f:8b:59:99: + 94:d1:93:3b:ff:32:47:01:7b:4f:d2:82:7a:af:ab: + 59:e3:53:68:7f:2d:56:29:a4:15:7d:1b:10:91:66: + 3c:92:b6:1a:8b:39:ee:17:b1:21:74:93:64:62:f1: + 8e:98:c1:62:28:2a:2e:ad:82:2d:5d:dc:19:20:73: + 91:b8:97:f4:d2:4f:43:bb:6c:19:ef:2b:f9:21:27: + 1d:3f:c8:93:35:84:1c:43:fb:c2:2f:3b:67:ea:71: + 84:a5:f5:12:9e:e0:fd:2f:c4:5f:6c:51:07:15:77: + 92:1d:89:77:2b:8c:44:20:d5:cb:22:d9:c2:09:02: + 80:44:0f:c1:74:f2:6e:a8:0f:09:30:78:03:f5:87: + 04:93:c1:64:81:ef:c6:78:39:64:de:06:fb:55:d9: + a0:b8:29:bb:09:19:cc:56:45:18:b6:d2:38:9b:9e: + d6:da:eb:1c:9e:5a:e2:92:d8:ae:da:32:0f:71:21: + 38:af:a6:c7:d4:44:69:af:3d:b9:1e:64:c1:55:eb: + fb:ed:4c:37:0e:ff:4b:75:36:cd:66:23:e8:6a:11: + 20:02:15:30:c4:cd:46:3d:ec:95:e3:6c:a8:ee:ac: + 74:e3:11:18:6d:2f:d9:b1:81:a1:5f:69:e2:af:92: + cc:80:ea:a2:41:35:3b:d4:1c:c6:5c:77:3e:ff:51: + 8b:17:9b:65:25:22:a2:0a:12:4e:fc:b3:b6:67:1b: + 28:88:e5:33:f7:f5:b4:36:a1:46:1e:b7:e4:c4:88: + 2f:e8:ba:17:9b:06:59:bd:51:e2:4c:06:40:ea:09: + 0e:6b:8a:bb:bc:60:ca:70:05:ea:db:e5:30:7e:3d: + 92:91 +prime1: + 00:d5:26:49:52:d4:04:b6:43:66:da:7e:e1:16:a5: + 01:7b:38:18:08:ac:fe:ac:07:50:06:33:66:19:a3: + 90:47:d6:84:09:ab:f2:e3:00:45:40:d5:31:ab:17: + cc:52:28:71:f9:12:53:f2:42:03:cc:6b:e6:32:fe: + 37:7c:0d:36:d9:e3:90:5c:0d:43:67:01:4d:fd:c1: + 66:29:17:e9:b0:a3:d6:09:b7:5f:c1:14:7e:44:8f: + 9d:c0:04:a3:f9:db:25:e4:41:f6:64:31:5b:29:f9: + 16:bc:ec:72:b3:0b:36:28:fe:53:26:71:6d:16:f1: + 81:86:2a:b5:a1:64:05:b4:9e:d4:20:71:81:df:26: + de:79:d6:96:a6:9d:ed:99:cc:a6:25:c0:18:ed:74: + f7:14:0b:93:4f:d8:99:0b:26:10:e2:f2:85:71:1d: + 89:2d:b3:70:ad:48:4e:a3:92:f6:5c:a3:c0:ed:4b: + c7:67:15:8a:fd:80:36:9e:ef:14:be:90:6f:a9:b8: + 34:11:1e:60:50:3c:aa:be:3d:84:a5:0b:86:51:d8: + 85:e3:e0:f8:52:4a:bf:2d:f5:c3:01:d7:a4:5e:0d: + 7b:9b:3b:e7:71:b3:12:76:bc:4e:20:75:7d:74:83: + 2d:56:8a:aa:5c:d1:5c:8f:3d:61:52:8c:a6:99:f9: + 9c:97 +prime2: + 00:c7:4e:b1:4f:7f:d0:7d:77:5a:5b:d4:10:92:47: + 5b:7c:9f:84:12:5b:82:f5:e8:8b:8f:80:8f:7d:6e: + 75:af:94:8e:35:9f:8c:06:81:d6:2d:e0:be:ad:9c: + 71:ae:ce:88:cd:af:35:62:6e:c2:67:d2:e6:72:46: + 1a:b4:fc:73:74:d8:4c:ab:b6:c7:ba:f1:b5:b5:7c: + 2c:b6:16:3a:e0:70:82:31:1a:ac:50:34:30:99:b2: + 3f:7c:f5:60:68:f5:d8:81:96:1d:f5:ea:2b:df:1f: + bf:0f:7f:69:07:60:7a:b0:4d:b4:01:41:5a:53:6c: + 5b:1f:56:8a:69:55:a1:5f:e1:11:6c:7d:c5:27:e5: + fb:9b:bf:e6:58:74:ef:9e:89:23:57:bb:a5:1d:74: + 71:43:6a:b2:30:5b:44:56:a9:57:75:d8:37:87:9b: + de:35:16:60:5b:51:f9:bf:2d:2d:b5:d6:35:52:b4: + 3f:34:bf:d6:cb:f1:9c:17:f4:ca:a6:8f:1f:1d:ce: + db:48:e9:b0:13:00:03:c5:c1:e4:e8:82:f3:77:5b: + 25:ef:5e:20:28:1e:be:d2:57:c9:e4:06:dc:dd:07: + c9:01:07:65:51:37:3e:86:e6:1b:ec:ae:7c:f5:f4: + 19:b5:e4:d2:5a:6d:56:62:ec:b8:43:58:0a:1f:37: + 77:c9 +exponent1: + 7d:0b:13:f2:ea:7c:c5:2c:2f:77:b8:fd:75:9a:61: + 8f:16:ee:4a:90:aa:6a:e3:73:57:df:e9:62:db:28: + b6:6c:2b:53:bd:33:25:66:b0:3a:03:98:3a:c6:20: + 50:86:77:ae:65:c9:27:93:00:c5:78:fb:38:29:19: + 05:c6:7e:ca:3e:8d:1e:e3:8d:0a:2d:a2:c2:5e:25: + ff:af:8e:a1:d8:cb:a5:31:95:94:20:e0:9e:7a:1e: + 52:5a:a6:93:da:b3:94:ff:f9:7a:f7:d5:82:7f:25: + 8e:b9:ab:e4:4b:8c:7f:6a:0b:ff:be:84:ff:f3:b8: + 47:ac:60:97:88:a5:2c:3c:0d:37:e7:3f:08:59:b6: + 24:85:f6:25:52:fa:e3:c2:42:2a:5d:52:82:63:9e: + db:7c:9a:f4:39:9e:37:03:22:de:f0:e5:c5:e1:4c: + eb:a9:9c:4d:9b:e0:be:67:65:ee:1d:06:fe:6e:f9: + 51:09:3b:5b:d2:4e:b8:d8:8b:33:ec:6a:05:88:11: + cb:85:25:7d:8c:c9:a2:07:56:fc:b8:11:19:8c:cb: + a7:4f:00:7e:ce:68:ef:9e:80:c3:60:ed:85:5b:a5: + 8b:01:0e:9b:0e:31:a3:c4:7e:94:de:38:36:15:0a: + 90:fd:92:4a:17:6c:94:7f:ae:cb:8d:c5:e3:08:a3: + 8b +exponent2: + 02:a4:8b:7b:57:61:87:58:5e:cd:5a:e9:81:57:0a: + e2:83:26:f8:2b:58:78:34:46:2d:77:f1:ef:22:d8: + d2:a4:30:a2:8b:64:0a:ee:0b:cd:fd:ed:e9:55:6a: + b8:7b:aa:9a:b7:99:08:9e:19:5b:d1:13:17:2e:d0: + c9:d7:93:1c:58:85:e3:bc:ff:b6:fd:df:7f:f1:8e: + 92:37:87:3e:54:9f:95:51:1a:39:d2:07:56:f2:63: + 1f:20:0d:d0:36:7a:51:75:91:1e:22:a5:c4:46:a2: + 7c:ed:1e:92:67:78:19:00:5e:c3:a9:7f:2e:1e:00: + b3:50:ad:73:2a:1c:82:ad:f4:52:30:f4:bd:4b:b2: + 63:65:4f:03:9b:41:56:23:d1:61:27:6e:d0:0e:2c: + 36:4d:a2:e1:3b:44:93:b5:99:20:49:e6:aa:98:a9: + 80:a0:b4:54:61:a8:e3:1d:11:3f:19:01:0a:00:b3: + d9:da:35:59:ec:f1:39:ec:18:07:cf:5c:05:44:29: + ea:34:97:0e:19:70:f3:5d:57:d0:b1:73:d3:00:55: + 67:70:23:13:05:1d:58:a2:ab:5d:a7:ad:a4:0c:a7: + 60:a9:1d:71:cf:3e:b8:01:33:1b:97:50:b6:de:2e: + bd:17:b4:a6:58:4e:cd:ee:ff:9e:7c:fb:5d:60:99: + e9 +coefficient: + 71:03:d0:58:4f:25:8f:54:77:12:49:91:80:b4:e0: + ac:ae:c2:c4:8e:fb:69:64:bb:13:6e:5a:22:72:be: + 04:dc:ab:7b:a8:79:fb:e7:60:ea:0c:6b:40:1c:50: + 29:28:32:8f:e8:d5:fb:27:9b:c3:77:ba:2b:39:02: + 1a:a1:7a:d1:2d:4e:ab:76:4f:52:63:79:ba:43:64: + 61:7d:25:2a:33:1e:58:25:cc:79:35:8b:6a:84:d4: + 09:6d:d3:1e:73:79:54:23:14:72:1f:12:d8:c5:e2: + 2b:88:0a:28:f0:73:8c:b3:05:25:c4:04:fc:75:ee: + 8c:59:11:4d:33:02:d5:45:e2:17:d0:bb:20:78:fe: + a0:db:90:87:f8:f4:50:be:05:16:0a:6c:a8:85:21: + b9:3d:d6:a9:2c:2e:dd:91:c6:83:c6:b6:76:c8:e0: + 30:59:fe:a7:c8:76:e9:fa:dc:5e:4c:4e:db:ed:c6: + f3:13:f5:60:d9:86:62:69:e7:77:86:e7:59:d2:c5: + 1d:79:bd:a8:55:a3:69:22:ac:61:dd:ae:0e:f5:80: + e1:79:2d:a8:90:81:35:65:2f:e9:50:70:6d:92:fc: + 58:fa:82:3f:67:16:0d:d5:15:ea:22:d1:8a:1f:28: + 64:cb:fd:9d:f1:fb:2e:3c:10:06:bf:a3:9e:7f:c5: + b6 +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/regress/scripts/win32-bacula-dir-tape.conf.in b/regress/scripts/win32-bacula-dir-tape.conf.in new file mode 100644 index 0000000000..f14bb8e18e --- /dev/null +++ b/regress/scripts/win32-bacula-dir-tape.conf.in @@ -0,0 +1,159 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39.23 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = localhost-dir + DIRPort = @dirport@ # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in @tmpdir@ +Job { + Name = "NightlySave" + Type = Backup + Client=Tibs + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +} + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=Tibs + FileSet="Full Set" + Storage = DDS-4 + Messages = Standard + Pool = Default + Where = @tmpdir@/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Enable VSS = yes + Include { Options { signature=MD5; portable=no + compression=GZIP } +# File = "c:/cygwin" # big + File = "c:/cygwin/home/kern/bacula/k" + } +} + + +# +# When to do the backups, full backup on first sunday of the month, +# differential (i.e. incremental since full) every other sunday, +# and incremental backups other days +Schedule { + Name = "WeeklyCycle" + Run = Full 1st sun at 1:05 + Run = Differential 2nd-5th sun at 1:05 + Run = Incremental mon-sat at 1:05 +} + +# Client (File Services) to backup +Client { + Name = Tibs + Address = tibs + FDPort = 9102 + Catalog = MyCatalog + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + +Client { + Name = localhost-fd + Address = localhost + FDPort = @fdport@ + Catalog = MyCatalog + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" + File Retention = 30d # 30 days + Job Retention = 180d # six months + AutoPrune = yes # Prune expired Jobs/Files + Maximum Concurrent Jobs = 4 +} + + +# Definition of DDS tape storage device +Storage { + Name = DDS-4 + Address = 192.168.68.112 # N.B. Use a fully qualified name here + SDPort = @sdport@ + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" # password for Storage daemon + Device = DDS-4 # must be same as Device in Storage daemon + Media Type = DDS-4 # must be same as MediaType in Storage daemon + AutoChanger = yes + Maximum Concurrent Jobs = 4 +} + + +# Generic catalog service +Catalog { + Name = MyCatalog + dbname = regress; user = regress; password = "" +} + +# Reasonable message delivery -- send most everything to email address +# and to the console +Messages { + Name = Standard + mailcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: %t %e of %c %l\" %r" + operatorcommand = "@sbindir@/bsmtp -h localhost -f \"\(Bacula regression\) %r\" -s \"Regression: Intervention needed for %j\" %r" + MailOnError = @job_email@ = all, !terminate + operator = @job_email@ = mount + console = all, !skipped, !terminate, !restored +# +# WARNING! the following will create a file that you must cycle from +# time to time as it will grow indefinitely. However, it will +# also keep all your messages if the scroll off the console. +# + append = "@working_dir@/log" = all, !skipped +} + +# +# Message delivery for daemon messages (no job). +Messages { + Name = Daemon + mailcommand = "@sbindir@/bsmtp -h @smtp_host@ -f \"\(Bacula regression\) %r\" -s \"Regression daemon message\" %r" + mail = @job_email@ = all, !skipped + console = all, !skipped, !saved + append = "@working_dir@/log" = all, !skipped +} + + +# Default pool definition +Pool { + Name = Default + Pool Type = Backup + Recycle = yes # Bacula can automatically recycle Volumes + AutoPrune = yes # Prune expired volumes + Volume Retention = 365d # one year +} diff --git a/regress/scripts/win32-bacula-fd.conf.in b/regress/scripts/win32-bacula-fd.conf.in new file mode 100644 index 0000000000..115b83d0e7 --- /dev/null +++ b/regress/scripts/win32-bacula-fd.conf.in @@ -0,0 +1,33 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 1.33 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = rufus-dir + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = localhost-fd + FDport = 8102 # where we listen for the director + WorkingDirectory = "/home/kern/bacula/regress/working" + Pid Directory = "/home/kern/bacula/regress/working" + SubSys Directory = "/home/kern/bacula/regress/working" +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = rufus-dir = all, !terminate +} diff --git a/regress/scripts/win32-bacula-sd-tape.conf.in b/regress/scripts/win32-bacula-sd-tape.conf.in new file mode 100644 index 0000000000..638b402cd8 --- /dev/null +++ b/regress/scripts/win32-bacula-sd-tape.conf.in @@ -0,0 +1,54 @@ +# +# Default Bacula Storage Daemon Configuration file +# +# For Bacula release 1.39.23 +# +# You may need to change the name of your tape drive +# on the "Archive Device" directive in the Device +# resource. If you change the Name and/or the +# "Media Type" in the Device resource, please ensure +# that dird.conf has corresponding changes. +# + +Storage { # definition of myself + Name = localhost-sd + SDPort = 8103 # Director's port + WorkingDirectory = "/home/kern/bacula/regress/working" + Pid Directory = "/home/kern/bacula/regress/working" + Subsys Directory = "/home/kern/bacula/regress/working" +} + +# +# List Directors who are permitted to contact Storage daemon +# +Director { + Name = localhost-dir + Password = "ccV3lVTsQRsdIUGyab0N4sMDavui2hOBkmpBU0aQKOr9" +} + +# +# Devices supported by this Storage daemon +# To connect, the Director's bacula-dir.conf must have the +# same Name and MediaType. +# + +Device { + Name = DDS-4 # + Media Type = DDS-4 + Archive Device = /dev/nst0 + AutomaticMount = yes; # when device opened, read it + AlwaysOpen = yes; + RemovableMedia = yes; + @/home/kern/bacula/regress/bin/tape_options +# Maximum File Size = 1000000 +# MaximumVolumeSize = 100M +} + +# +# Send all messages to the Director, +# mount messages also are sent to the email address +# +Messages { + Name = Standard + director = rufus-dir = all, !terminate +} diff --git a/regress/starttime b/regress/starttime new file mode 100755 index 0000000000..e6aa3ea6a9 --- /dev/null +++ b/regress/starttime @@ -0,0 +1,6 @@ +#!/usr/bin/env python +from time import time as now + +fn = open('time.out', 'w+') +fn.write('%s' % now()) +fn.close() diff --git a/regress/tape b/regress/tape new file mode 100755 index 0000000000..718cefe7d5 --- /dev/null +++ b/regress/tape @@ -0,0 +1,2 @@ +#!/bin/sh +./all-non-root-tape-tests diff --git a/regress/tests/2drive-3pool-test b/regress/tests/2drive-3pool-test new file mode 100755 index 0000000000..3cb13a578d --- /dev/null +++ b/regress/tests/2drive-3pool-test @@ -0,0 +1,83 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory. Create three +# tapes, each in a different pool, then run some jobs asking for the +# volume on drive three. It should find it without moving the +# volume. +# +# This script uses the virtual disk autochanger and two drives +# +TestName="2drive-3pool-disk" +JobName="2dr3pooldisk" +. scripts/functions + +scripts/cleanup +scripts/copy-2disk-drive-confs +scripts/prepare-two-disks + +echo "${cwd}/build" >${cwd}/tmp/file-list +change_jobname NightlySave $JobName +start_test + +# Turn off Prefer Mounted Volumes so we use 2 drives +# outf="tmp/sed_tmp" +# echo "s%# Prefer Mounted Volumes% Prefer Mounted Volumes%g" >${outf} +# cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +# Comment the next line out to write everything to one drive +# otherwise, it writes the two jobs to different drives +# sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +setdebug level=51 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Full drive=1 +@#label storage=DDS-4 volume=TestVolume003 slot=3 Pool=Inc drive=2 +status storage=DDS-4 +@#run job=$JobName level=Full Pool=Inc yes +run job=$JobName level=Full Pool=Full yes +run job=$JobName level=Full Pool=Default yes +setdebug level=200 storage=DDS-4 +run job=$JobName level=Full Pool=Default yes +run job=$JobName level=Full Pool=Default yes +@sleep 10 +status storage=DDS-4 +list volumes +wait +list volumes +list jobs +status storage=DDS-4 +messages +quit +END_OF_DATA + +# exit + +run_bacula +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff + +end_test diff --git a/regress/tests/2drive-concurrent-test b/regress/tests/2drive-concurrent-test new file mode 100755 index 0000000000..c888a0c40e --- /dev/null +++ b/regress/tests/2drive-concurrent-test @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Run four jobs at the same time, with two Volumes. +# Set max Vol bytes of first volume +# to less than total backup to force Bacula to use the second +# Volume. +# +TestName="2drive-concurrent-test" +JobName=Four-concurrent-jobs +. scripts/functions + +scripts/cleanup +scripts/copy-2disk-drive-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label pool=Default storage=DDS-4 volume=TestVolume001 slot=1 drive=0 +label pool=Default storage=DDS-4 volume=TestVolume002 slot=2 drive=1 +update Volume=TestVolume001 MaxVolBytes=100000000 +@#50000000 +@#12 +setdebug level=001 Storage=DDS-4 +status storage=DDS-4 +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=DDS-4 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=DDS-4 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=DDS-4 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +status storage=DDS-4 +run job=$JobName level=Full Storage=DDS-4 +yes +status storage=DDS-4 +reload +reload +reload +reload +@sleep 2 +status dir +status storage=DDS-4 +llist volume=TestVolume001 +llist volume=TestVolume002 +reload +@sleep 5 +messages +reload +reload +wait +status storage=DDS-4 +reload +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +reload +reload +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/2drive-incremental-2disk b/regress/tests/2drive-incremental-2disk new file mode 100755 index 0000000000..353ff267fb --- /dev/null +++ b/regress/tests/2drive-incremental-2disk @@ -0,0 +1,114 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +# This script uses the virtual disk autochanger and two drives +# +TestName="2drive-incremental-2disk" +JobName="2drive2disk" +. scripts/functions + +scripts/cleanup +scripts/copy-2disk-drive-confs +scripts/prepare-two-disks + +change_jobname localhost-fd $JobName +start_test + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +# Turn off Prefer Mounted Volumes so we use 2 drives +outf="${cwd}/tmp/sed_tmp" +echo "s%# Prefer Mounted Volumes% Prefer Mounted Volumes%g" >${outf} +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +# Comment the next line out to write everything to one drive +# otherwise, it writes the two jobs to different drives +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +setdebug level=3 dir +setdebug level=3 storage=DDS-4 +setdebug level=3 client +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=1 +status storage=DDS-4 +@#setdebug level=120 storage=DDS-4 +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +@sleep 3 +status storage=DDS-4 +wait +list volumes +list jobs +status storage=DDS-4 +messages +quit +END_OF_DATA + +run_bacula +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +status storage=DDS-4 +@#setdebug level=120 storage=DDS-4 +run level=Incremental job=NightlySave yes +wait +list volumes +status storage=DDS-4 +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# The restore should read from TestVolume002, which was on drive 1 +grep TestVolume002 ${cwd}/tmp/log2.out >/dev/null 2>&1 +# Note rstat may already be set, so we don't just store into it +if [ $? != 0 ] ; then + rstat=$? +fi + +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c +check_restore_tmp_build_diff + +end_test diff --git a/regress/tests/2drive-incremental-2tape b/regress/tests/2drive-incremental-2tape new file mode 100755 index 0000000000..bdf03186a5 --- /dev/null +++ b/regress/tests/2drive-incremental-2tape @@ -0,0 +1,110 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +# This script uses the autochanger and two tapes +# +TestName="2drive-incremental-2tape" +JobName="2drive2tape" +. scripts/functions + +if test x${TAPE_DRIVE1} = x/dev/null ; then + echo "Skipping 2drive-incremental-2tape test. No second drive." + exit +fi + + +scripts/copy-2drive-confs +scripts/cleanup-2drive + +change_jobname localhost-fd $JobName + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +# Turn off Prefer Mounted Volumes so we use 2 drives +outf="${cwd}/tmp/sed_tmp" +echo "s%# Prefer Mounted Volumes% Prefer Mounted Volumes%g" >${outf} +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +# Comment the next line out to write everything to one drive +# otherwise, it writes the two jobs to different drives +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=1 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +@sleep 3 +status storage=DDS-4 +wait +list volumes +list jobs +status storage=DDS-4 +messages +quit +END_OF_DATA + +run_bacula + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +status storage=DDS-4 +@#setdebug level=400 storage=DDS-4 +run level=Incremental job=NightlySave yes +wait +list volumes +status storage=DDS-4 +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c +check_restore_tmp_build_diff + +end_test diff --git a/regress/tests/ansi-label-tape b/regress/tests/ansi-label-tape new file mode 100755 index 0000000000..17d83d8ccd --- /dev/null +++ b/regress/tests/ansi-label-tape @@ -0,0 +1,91 @@ +#!/bin/sh +# +# Test of ANSI labeled tapes +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# We also use the purge and the relabel commands as +# well as a pile of status storage commands. +# +TestName="ansi-label-tape" +JobName=backuptape +. scripts/functions + +scripts/copy-tape-confs +/bin/cp -f scripts/ansi-sd-tape.conf bin/bacula-sd.conf +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=200 storage=DDS-4 +label storage=DDS-4 volume=Vol001 slot=0 pool=Default +purge volume=Vol001 +relabel pool=Default storage=DDS-4 oldVolume=Vol001 volume=Vol002 slot=0 +purge volume=Vol002 +relabel pool=Default storage=DDS-4 oldVolume=Vol002 volume=Vol001 slot=0 +run job=$JobName yes +status storage=DDS-4 +@sleep 1 +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# +# Now do a second backup after making a few changes +# +touch ${cwd}/build/src/dird/*.c +echo "test test" > ${cwd}/build/src/dird/xxx + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +list volumes +@#setdebug level=300 storage=DDS-4 +run job=$JobName yes +wait +list volumes +messages +@# +@# now do a second restore +@# +@$out ${cwd}/tmp/log2.out +list volumes +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/auto-label-test b/regress/tests/auto-label-test new file mode 100755 index 0000000000..0b85a90fa0 --- /dev/null +++ b/regress/tests/auto-label-test @@ -0,0 +1,64 @@ +#!/bin/sh +# +# Test if Bacula can automatically create a Volume label. +# + +TestName="auto-label-test" +JobName=AutoLabel +. scripts/functions + +copy_test_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +sed "s%# Label Format% Label Format%" ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +status all +status all +list pools +messages +@#setdebug level=110 storage=File +run job=$JobName storage=File yes +list pools +list volumes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +count +ls * +dir * +find Makefile +pwd +lsmark +estimate +? +help +done +yes +wait +messages +@$out +quit +END_OF_SCRIPT + +run_bacula +check_for_zombie_jobs storage=File || exit 1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/backup-bacula-tape b/regress/tests/backup-bacula-tape new file mode 100755 index 0000000000..4c984d57f8 --- /dev/null +++ b/regress/tests/backup-bacula-tape @@ -0,0 +1,116 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# We also use the purge and the relabel commands as +# well as a pile of status storage commands. +# +TestName="backup-bacula-tape" +JobName=backuptape +. scripts/functions + +scripts/copy-tape-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=200 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +purge volume=TestVolume001 +relabel pool=Default storage=DDS-4 oldVolume=TestVolume001 volume=TestVolume002 slot=0 +purge volume=TestVolume002 +relabel pool=Default storage=DDS-4 oldVolume=TestVolume002 volume=TestVolume001 slot=0 +run job=$JobName yes +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# +# Now do a second backup after making a few changes +# +touch ${cwd}/build/src/dird/*.c +echo "test test" > ${cwd}/build/src/dird/xxx + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +list volumes +run job=$JobName yes +wait +list volumes +messages +@# +@# now do a second restore +@# +@$out ${cwd}/tmp/log2.out +list volumes +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/backup-bacula-test b/regress/tests/backup-bacula-test new file mode 100755 index 0000000000..0815c38316 --- /dev/null +++ b/regress/tests/backup-bacula-test @@ -0,0 +1,92 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="backup-bacula-test" +JobName=backup +. scripts/functions + +scripts/cleanup +scripts/copy-confs + +change_jobname Client1 $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label volume=TestVolume001 storage=File pool=Default +@#setdebug level=100 storage=File +run job=$JobName yes +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +@sleep 1 +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +@sleep 1 +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=100 storage=File +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +messages +@$out +quit +END_OF_DATA + +# +# Now do a second backup after making a few changes +# +touch ${cwd}/build/src/dird/*.c +echo "test test" > ${cwd}/build/src/dird/xxx +# + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/backup-to-null b/regress/tests/backup-to-null new file mode 100755 index 0000000000..a8b2af2f39 --- /dev/null +++ b/regress/tests/backup-to-null @@ -0,0 +1,74 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# We also use the purge and the relabel commands as +# well as a pile of status storage commands. +# +TestName="backup-to-null" +JobName=backuptonull +. scripts/functions + +scripts/cleanup +scripts/copy-fifo-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +rm -f ${cwd}/tmp/log1.out ${cwd}/tmp/log2.out +start_test + + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=200 storage=Dummy +label storage=Dummy volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +status storage=Dummy +@sleep 1 +wait +@sleep 3 +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=Dummy +stop_bacula + +# +# Now do a second backup after making a few changes +# +touch ${cwd}/build/src/dird/*.c +echo "test test" > ${cwd}/build/src/dird/xxx + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log2.out +list volumes +run job=$JobName yes +wait +list volumes +@sleep 3 +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=Dummy +stop_bacula + +grep "^ Termination: *Backup OK" ${cwd}/tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Backup OK" ${cwd}/tmp/log2.out 2>&1 >/dev/null +dstat=$? + +# not yet implemented +rstat=0 + +end_test diff --git a/regress/tests/backup-win32-tape b/regress/tests/backup-win32-tape new file mode 100755 index 0000000000..2c67ddce85 --- /dev/null +++ b/regress/tests/backup-win32-tape @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="backup-win32-tape" +JobName=backupwintape +. scripts/functions + +scripts/cleanup-tape +scripts/copy-win32-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=NightlySave yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$outt ${cwd}/tmp/log2.out +@#restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +@#yes +@#wait +@#messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/bextract-test b/regress/tests/bextract-test new file mode 100755 index 0000000000..80085b3265 --- /dev/null +++ b/regress/tests/bextract-test @@ -0,0 +1,56 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# split the archive into two volumes, then build a BSR with +# the restore command and use bextract to restore the files. +# +TestName="bextract-test" +JobName="bextract" +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +@#setdebug level=400 dir +@#setdebug level=400 storage=File1 +run job=$JobName storage=File1 yes +wait +messages +@# +@# now build the bsr file but do not restore +@# +@$out ${cwd}/tmp/log2.out +restore bootstrap=${cwd}/working/restore.bsr where=${cwd}/tmp/bacula-restores select all storage=File1 done +no +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +mkdir -p ${cwd}/tmp/bacula-restores +if test "$debug" -eq 1 ; then + bin/bextract -v -b working/restore.bsr -c bin/bacula-sd.conf ${cwd}/tmp ${cwd}/tmp/bacula-restores +else + bin/bextract -b working/restore.bsr -c bin/bacula-sd.conf ${cwd}/tmp ${cwd}/tmp/bacula-restores 2>&1 >/dev/null +fi +rstat=$? +grep "^ Termination: *Backup OK" ${cwd}/tmp/log1.out 2>&1 >/dev/null +bstat=$? +check_restore_diff +end_test diff --git a/regress/tests/big-vol-test b/regress/tests/big-vol-test new file mode 100755 index 0000000000..21e4167737 --- /dev/null +++ b/regress/tests/big-vol-test @@ -0,0 +1,82 @@ +#!/bin/sh +# +# Create a big Volume > 5 GB and backup to it to test disk +# seeking on big volumes. We cheat and artifically grow +# the volume. +# +TestName="big-vol-test" +JobName=bigvol +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +cwd=`pwd` +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=100 storage=File +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File + +# +# Now increase the size of the Volume using gigaslam +# +cd ${cwd}/tmp +# make big file +size=5200000000 +${cwd}/build/src/tools/grow TestVolume001 ${size} +if [ $? != 0 ]; then + echo "Execute of ${cwd}/build/src/tools/grow failed." + exit 1 +fi +cd ${cwd} + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +sql +UPDATE Media SET Volbytes=${size} WHERE VolumeName='TestVolume001'; + +llist volume=TestVolume001 +@# Now do another full save with big Volume +run level=Full job=$JobName yes +wait +messages +@# +@# now do a restore +@# +sql +SELECT * FROM JobMedia; + +@output ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File select all done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test +# Get rid of big files +rm -f ${cwd}/tmp/TestVolume001 diff --git a/regress/tests/bscan-fast-tape b/regress/tests/bscan-fast-tape new file mode 100755 index 0000000000..7e2b38e329 --- /dev/null +++ b/regress/tests/bscan-fast-tape @@ -0,0 +1,88 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then +# do a bscan and restore. +# It should require at least 4 different bsrs. +# +TestName="bscan-tape" +JobName=bscantape +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +# sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +setdebug level=2 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +echo "Starting Bacula tape writing" +#bin/btape -c bin/bacula-sd.conf /dev/nst0 </dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +echo "Begin attempt to read tape that crashes the system" +echo "volume=TestVolume001" >tmp/bscan.bsr +strace -o strace.new bin/bscan -d200 -w working -u regress -n regress -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 +exit +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula +rm -f ${cwd}/build/src/lib/dummy + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/bscan-tape b/regress/tests/bscan-tape new file mode 100755 index 0000000000..cfca352c91 --- /dev/null +++ b/regress/tests/bscan-tape @@ -0,0 +1,145 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then +# do a bscan and restore. +# It should require at least 4 different bsrs. +# +TestName="bscan-tape" +JobName=bscantape +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +estimate job=$JobName listing +estimate job=$JobName listing +estimate job=$JobName listing +messages +@$out tmp/log1.out +setdebug level=2 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +run job=$JobName level=Full yes +wait +run job=$JobName level=Full yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +# +# run a second job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +echo "Backup 2 done" +touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a third job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +echo "Backup 3 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +#echo "abc" > ${cwd}/build/src/lib/dummy +# +# run a fourth job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula + +scripts/check_for_zombie_jobs storage=DDS-4 +stop_bacula + +echo "Backup 4 done" +# +# now drop and recreate the database +# +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +echo "volume=TestVolume001" >tmp/bscan.bsr +if test "$debug" -eq 1 ; then + bin/bscan -w working -u regress -n regress -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 +else + bin/bscan -w working -u regress -n regress -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 2>&1 >/dev/null +fi + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula +rm -f ${cwd}/build/src/lib/dummy + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/bscan-test b/regress/tests/bscan-test new file mode 100755 index 0000000000..fd71ef336d --- /dev/null +++ b/regress/tests/bscan-test @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# split the archive into two volumes then bscan it +# into the catalog after the backup. It also to a limited +# extent tests the purge volume and delete volume commands. +# + +TestName="bscan-test" +JobName=bscan +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File1 +TestVolume001 +label storage=File1 +TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=$JobName storage=File1 +yes +wait +list volumes +list files jobid=1 +sql +select * from JobMedia; + + +messages +@$out /dev/null +@# +@# now purge the Volume +@# +purge volume=TestVolume001 +purge volume=TestVolume002 +delete volume=TestVolume001 +yes +delete volume=TestVolume002 +yes +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +echo "volume=TestVolume001" >tmp/bscan.bsr +echo "volume=TestVolume002" >>tmp/bscan.bsr + +if test "$debug" -eq 1 ; then + bin/bscan -w working -u regress -n regress -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf ${cwd}/tmp +else + bin/bscan -w working -u regress -n regress -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf ${cwd}/tmp 2>&1 >tmp/log3.out +fi + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +@#setdebug level=400 storage=File1 +restore bootstrap=tmp/kern.bsr where=tmp/bacula-restores select all storage=File1 done +yes +wait +messages +@$out +quit +END_OF_DATA + +# now run restore +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/bsr-opt-test b/regress/tests/bsr-opt-test new file mode 100755 index 0000000000..9413a8c081 --- /dev/null +++ b/regress/tests/bsr-opt-test @@ -0,0 +1,80 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# split the archive into two volumes, then restore +# files on only one of the volumes and ensure that +# the other volume is not used. I.e. bsr optimization +# works. +# +TestName="bsr-opt-test" +JobName=bsr-opt +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=$JobName storage=File1 yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore bootstrap=${cwd}/working/restore.bsr where=${cwd}/tmp/bacula-restores select storage=File1 +unmark * +cd ${cwd}/build/src/cats +mark * +ls +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula +# +# This test is not really reliable. What we want to do is +# to select files on only one Volume, then insure here +# that only one Volume is chosen. +# +grep TestVolume002 working/restore.bsr 2>&1 >/dev/null +bsrstat=$? +check_two_logs + +diff -r build/src/cats ${cwd}/tmp/bacula-restores${cwd}/build/src/cats 2>&1 >/dev/null +if [ $? != 0 -o $bsrstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then + echo " " + echo " " + echo " !!!!! bsr-opt-test Bacula source failed!!! !!!!! " + echo " !!!!! bsr-opt-test failed!!! !!!!! " >>test.out + if [ $bstat != 0 -o $rstat != 0 ] ; then + echo " !!!!! Bad Job termination status !!!!! " + echo " !!!!! Bad Job termination status !!!!! " >>test.out + elif [ $bsrstat != 0 ] ; then + echo " !!!!! Volume selection error !!!!! " + echo " !!!!! Volume selection error !!!!! " >>test.out + else + echo " !!!!! Restored files differ !!!!! " + echo " !!!!! Restored files differ !!!!! " >>test.out + fi + echo " " +else + echo " ===== bsr-opt-test Bacula source OK `date +%R:%S` ===== " + echo " ===== bsr-opt-test OK `date +%R:%S` ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/btape-fill-full-tape b/regress/tests/btape-fill-full-tape new file mode 100755 index 0000000000..7c32d04cda --- /dev/null +++ b/regress/tests/btape-fill-full-tape @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Test the fill command in btape +# +TestName="btape-fill-full-tape" +JobName=AutoLabel +. scripts/functions + +scripts/copy-tape-confs +scripts/cleanup-tape + +change_jobname $JobName +start_test + +bin/btape -c bin/bacula-sd.conf DDS-4 <&1 >${cwd}/tmp/log1.out +fill +s + +quit +END_OF_DATA + + +grep "^The last block on the tape matches\. Test succeeded\." ${cwd}/tmp/log1.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " !!!!! btape fill test failed!!! !!!!! " + echo " !!!!! btape fill test failed!!! !!!!! " >>test.out + echo " " +else + echo " ===== btape fill test OK ===== " + echo " ===== btape fill test OK ===== " >>test.out +# scripts/cleanup +fi diff --git a/regress/tests/btape-fill-tape b/regress/tests/btape-fill-tape new file mode 100755 index 0000000000..bca41b964d --- /dev/null +++ b/regress/tests/btape-fill-tape @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Test the fill command in btape +# +TestName="btape-fill-tape" +JobName=filltape +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# MaximumVolumeSize% MaximumVolumeSize%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +start_test + +cat <${cwd}/tmp/bconcmds +fill +s +quit +END_OF_DATA + +run_btape DDS-4 + +grep "^The last block on the tape matches\. Test succeeded\." ${cwd}/tmp/log1.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " !!!!! btape fill test failed!!! !!!!! " + echo " !!!!! btape fill test failed!!! !!!!! " >>test.out + echo " " +else + echo " ===== btape fill test OK ===== " + echo " ===== btape fill test OK ===== " >>test.out +# scripts/cleanup +fi diff --git a/regress/tests/bug-897 b/regress/tests/bug-897 new file mode 100755 index 0000000000..67d0c2f2bb --- /dev/null +++ b/regress/tests/bug-897 @@ -0,0 +1,105 @@ +#!/bin/sh +# +# Test bug 897 +# + +TestName="bug-897" +JobName=backup + +. scripts/functions +copy_test_confs + +rm -f bin/bacula-dir.conf +rm -f ${cwd}/tmp/RUN*log +rm -f ${cwd}/tmp/fifo +rm -f ${cwd}/tmp/RUN_BUG_897 +rm -f ${cwd}/tmp/RUN_FD_FAILED + +/bin/cp -f scripts/bacula-dir.conf.testrunscript bin/bacula-dir.conf + +echo "${cwd}/build/po" >${cwd}/tmp/file-list +echo "${cwd}/tmp/fifo" >> ${cwd}/tmp/file-list +mkfifo "${cwd}/tmp/fifo" + +# use this to be able to cancel a running job +( + cat > ${cwd}/tmp/fifo < /dev/zero + cat > ${cwd}/tmp/fifo < /dev/zero +) & + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +label volume=TestVolume001 +@$out ${cwd}/tmp/RUN_FD_FAILED.log +run job=RUN_FD_FAILED yes +wait +messages +@sleep 1 +@$out ${cwd}/tmp/RUN_BUG_897.log +setdebug level=200 client +run job=BUG_897 yes +@sleep 2 +cancel +yes +wait +messages +st dir +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +dstat=0 +bstat=0 +rstat=0 +export dstat +export bstat +export rstat + +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +a=$? +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED2"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +b=$? +grep 'dir: AfterJob: run command "/bin/echo RunAfterFailedJob"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +c=$? +grep 'touching' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +d=$? +grep '*** Backup Error ***' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +e=$? +if [ $a = 0 -a $b = 0 -a $c = 0 -a $d = 0 -a $e = 0 ] +then + [ "$debug" = 1 ] && echo RUN_FD_FAILED ok +else + echo "RUN_FD_FAILED in error" + rstat=1 +fi +if test -f ${cwd}/tmp/RUN_FD_FAILED +then + echo "The ${cwd}/tmp/RUN_FD_FAILED have been created, but nothing could be found" + echo "in the log" +fi + + +grep 'touching' ${cwd}/tmp/RUN_BUG_897.log >/dev/null 2>&1 +d=$? +if [ $d = 0 ] +then + [ "$debug" = 1 ] && echo RUN_FD_FAILED ok +else + echo "RUN_BUG_897 in error" + rstat=1 +fi +if test -f ${cwd}/tmp/RUN_BUG_897 +then + echo "The ${cwd}/tmp/RUN_BUG_897 have been created, but nothing could be found" + echo "in the log" +fi + + + +end_test diff --git a/regress/tests/bug-fatal-test b/regress/tests/bug-fatal-test new file mode 100755 index 0000000000..249858d6fb --- /dev/null +++ b/regress/tests/bug-fatal-test @@ -0,0 +1,45 @@ +#!/bin/sh +# +# Test RunScript +# + +TestName="bug-fatal-test" +JobName=backup + +. scripts/functions + +copy_test_confs + +rm -f bin/bacula-dir.conf +rm -f ${cwd}/tmp/RUN*log +/bin/cp -f scripts/bacula-dir.conf.testrunscript bin/bacula-dir.conf + +rm -f ${cwd}/tmp/file-list +# ${cwd}/tmp/file-list doesn't exists +# echo "${cwd}/build/po" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +label volume=TestVolume001 +@$out ${cwd}/tmp/RUN_BUG_FATAL.log +run job=BUG_FATAL yes +wait +messages +@sleep 1 +st dir +quit +END_OF_DATA + + +bin/bacula start +cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf > /dev/null +stop_bacula + +export dstat=0 +export bstat=0 +export rstat=0 + +end_test diff --git a/regress/tests/compress-encrypt-test b/regress/tests/compress-encrypt-test new file mode 100755 index 0000000000..d4eb0cae52 --- /dev/null +++ b/regress/tests/compress-encrypt-test @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup with encryption and compression of the Bacula build directory +# then verify the signatures. +# +TestName="compressed-encrypt-test" +JobName=CompressedTest +. scripts/functions + +scripts/cleanup +scripts/copy-crypto-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +setdebug level=10 fd +run job=$JobName yes +wait +messages +list volumes +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +@# setdebug level=0 fd +restore where=${cwd}/tmp/bacula-restores storage=File +5 +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/compressed-test b/regress/tests/compressed-test new file mode 100755 index 0000000000..47fc8e4362 --- /dev/null +++ b/regress/tests/compressed-test @@ -0,0 +1,54 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then restore it. +# +TestName="compressed-test" +JobName=compressed +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +status all +status all +messages +label storage=File volume=TestVolume001 +run job=$JobName storage=File yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +grep " Software Compression" ${cwd}/tmp/log1.out | grep "%" 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " !!!!! No compression !!!!!" + bstat=1 +fi +end_test diff --git a/regress/tests/concurrent-jobs-test b/regress/tests/concurrent-jobs-test new file mode 100755 index 0000000000..37c69bd801 --- /dev/null +++ b/regress/tests/concurrent-jobs-test @@ -0,0 +1,66 @@ +#!/bin/sh +# +# Run two jobs at the same time +# + +TestName="concurrent-jobs-test" +JobName=concurrent-jobs +. scripts/functions + +copy_test_confs + +echo "${cwd}/tmp/largefile" >${cwd}/tmp/file-list +if test -c /dev/urandom ; then +# Create 56MB file with random data + echo "Creating a 56MB file with random data ..." + dd if=/dev/urandom of=${cwd}/tmp/largefile bs=1024 count=55000 +else + echo "Creating a 56MB file with bacula-dir data ..." + dd if=bin/bacula-dir of=${cwd}/tmp/1 bs=1024 count=1000 + cat ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 ${cwd}/tmp/1 >${cwd}/tmp/2 + rm -f ${cwd}/tmp/1 + cat ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 ${cwd}/tmp/2 >>${cwd}/tmp/3 + rm -f ${cwd}/tmp/2 + cat ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 ${cwd}/tmp/3 >${cwd}/tmp/largefile + rm -f ${cwd}/tmp/3 +fi + +echo "largefile created" + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName level=Full yes +run job=$JobName level=Full yes +run job=$JobName level=Full yes +run job=$JobName level=Full yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/tests/data-encrypt-test b/regress/tests/data-encrypt-test new file mode 100755 index 0000000000..581b8a219c --- /dev/null +++ b/regress/tests/data-encrypt-test @@ -0,0 +1,53 @@ +#!/bin/sh +# +# Run a simple backup with encryption and no other options +# (i.e. no compression and no sparse handling) of the +# Bacula build directory. +# +TestName="data-encrypt-test" +JobName=Crypto +. scripts/functions + +scripts/cleanup +scripts/copy-crypto-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +@#setdebug level=10 fd +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +@#setdebug level=10 fd +restore where=${cwd}/tmp/bacula-restores storage=File +5 +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +du -s build +du -s ${cwd}/tmp/bacula-restores/ + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/dev-test-root b/regress/tests/dev-test-root new file mode 100755 index 0000000000..0d005e56b7 --- /dev/null +++ b/regress/tests/dev-test-root @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# + +TestName="dev-test-root" +. scripts/functions + +require_root + +scripts/cleanup +scripts/copy-test-confs +echo "/dev" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=NightlySave yes +wait +messages +@# +@# now do a restore +@# +@output ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +# More cleanup needed below + +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/restored +cd ${cwd}/tmp +# +# Use sed to cut out parts that *always* change +# +cat >sed.scr <1 +sed -f sed.scr 1 | sort >original +# +mv -f restored 1 +sed -f sed.scr 1 | sort >restored +rm -f sed.scr +# +cd ${cwd} +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! dev-test-root failed !!!! ===== " + echo " ===== !!!! dev-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== dev-test-root OK ===== " + echo " ===== dev-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/differential-test b/regress/tests/differential-test new file mode 100755 index 0000000000..7ef57dc220 --- /dev/null +++ b/regress/tests/differential-test @@ -0,0 +1,87 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do a differential and restore those two files. +# +TestName="differential-test" +JobName=differential +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +mkdir ${cwd}/tmp/build +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume002 +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +scripts/check_for_zombie_jobs storage=File +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force differential on the second Volume +update volume=TestVolume002 VolStatus=Used +run level=differential job=$JobName yes +wait +messages +@$out +END_OF_DATA + +run_bconsole + +scripts/check_for_zombie_jobs storage=File +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=incremental job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +scripts/check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +# +# Delete .c files because we will only restore the txt files +# +rm -f ${cwd}/tmp/build/*.c +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/eighty-simultaneous-jobs-tape b/regress/tests/eighty-simultaneous-jobs-tape new file mode 100755 index 0000000000..3fe631fceb --- /dev/null +++ b/regress/tests/eighty-simultaneous-jobs-tape @@ -0,0 +1,133 @@ +#!/bin/sh +# +# Run eighty jobs at the same time +# +TestName="eighty-simultaneous-jobs-tape" +JobName=EightySimultaneousJobs +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +@sleep 2 +status dir +@sleep 5 +status dir +status storage=DDS-4 +messages +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +exit + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/encrypt-bug-test b/regress/tests/encrypt-bug-test new file mode 100755 index 0000000000..93f2b2ef35 --- /dev/null +++ b/regress/tests/encrypt-bug-test @@ -0,0 +1,64 @@ +#!/bin/sh +# +# Run a simple backup of untitled15.jpg that fails to +# restore properly in bug #763 +# +TestName="encrypt-bug-test" +JobName=Crypto-bug +. scripts/functions + +scripts/cleanup +scripts/copy-crypto-confs +echo "${cwd}/encrypt-bug.jpg" >${cwd}/tmp/file-list +echo "${cwd}/encrypt-bug.jpg" >${cwd}/tmp/restore-list +echo "${cwd}/encrypt-bug.txt" >>${cwd}/tmp/file-list +echo "${cwd}/encrypt-bug.txt" >>${cwd}/tmp/restore-list +echo "${cwd}/encrypt-bug2.txt" >>${cwd}/tmp/file-list +echo "${cwd}/encrypt-bug2.txt" >>${cwd}/tmp/restore-list +files="encrypt-bug.jpg encrypt-bug.txt encrypt-bug2.txt" +mkdir -p ${cwd}/tmp/build +for i in ${files}; do + cp -p ${cwd}/encrypt-bug*.* ${cwd}/tmp/build +done + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +setdebug level=100 fd +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +setdebug level=100 fd +restore where=${cwd}/tmp/bacula-restores storage=File +5 +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +du -s build +du -s ${cwd}/tmp/bacula-restores/ + + +check_two_logs +diff ${cwd}/tmp/build ${cwd}/tmp/bacula-restores/${cwd} 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/tests/eot-fail-tape b/regress/tests/eot-fail-tape new file mode 100755 index 0000000000..33bf4035b1 --- /dev/null +++ b/regress/tests/eot-fail-tape @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to two tapes where the maximum tape file size is set to 1M +# +TestName="eot-fail-tape" +JobName=eotfailtape +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +out="${cwd}/tmp/sed_tmp" +echo "s%# Maximum File Size% Maximum File Size%g" >${out} +cp -f ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed -f ${out} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@tee +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/errors-test b/regress/tests/errors-test new file mode 100755 index 0000000000..5bd40fcb49 --- /dev/null +++ b/regress/tests/errors-test @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Test errors +# + +TestName="errors-test" +JobName=backup + +. scripts/functions + +scripts/cleanup +copy_test_confs + +rm -f ${cwd}/tmp/*.log +/bin/cp -f scripts/bacula-dir.conf.errors bin/bacula-dir.conf +echo "${cwd}/build/po" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/LOCAL_INC_ERR.log +label storage=File volume=TestVolume001 +add storage=File2 +1 +File2 +1 +run job=LOCAL_INC_ERR yes +wait +messages +@output ${cwd}/tmp/REMOTE_INC_ERR.log +run job=REMOTE_INC_ERR yes +wait +messages +@output ${cwd}/tmp/LOCAL_EXCL_ERR.log +run job=LOCAL_EXCL_ERR yes +wait +messages +@$out ${cwd}/tmp/REMOTE_EXCL_ERR.log +run job=REMOTE_EXCL_ERR yes +wait +messages +@$out ${cwd}/tmp/REMOTE_RUNSCRIPT_ERR.log +run job=REMOTE_RUNSCRIPT_ERR yes +wait +messages +@$out ${cwd}/tmp/LOCAL_RUNSCRIPT_ERR.log +run job=LOCAL_RUNSCRIPT_ERR yes +wait +messages +@$out ${cwd}/tmp/CLIENT_CONNECT_TIMEOUT.log +run job=CLIENT_CONNECT_TIMEOUT yes +wait +messages +@$out ${cwd}/tmp/SD_CONNECT_TIMEOUT.log +run job=SD_CONNECT_TIMEOUT yes +wait +messages +status dir +status storage=File +quit +END_OF_DATA + +run_bacula +touch ${cwd}/tmp/log1.out +client=$(grep client= bin/bacula-dir.conf) +check_for_zombie_jobs storage=File $client +stop_bacula + +dstat=0 +bstat=0 +rstat=0 +export dstat +export bstat +export rstat + + +end_test diff --git a/regress/tests/etc-test-root b/regress/tests/etc-test-root new file mode 100755 index 0000000000..50a45f2cbf --- /dev/null +++ b/regress/tests/etc-test-root @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="etc-test-root" +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "/etc" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/log1.out +label storage=File +TestVolume001 +run job=NightlySave +yes +wait +messages +@# +@# now do a restore +@# +@output ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +# more cleanup needed below + +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/1 +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/2 +sort <${cwd}/tmp/1 >${cwd}/tmp/original +sort <${cwd}/tmp/2 >${cwd}/tmp/restored +rm -f ${cwd}/tmp/1 ${cwd}/tmp/2 +cd ${cwd} +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! etc-test-root failed !!!! ===== " + echo " ===== !!!! etc-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== etc-test-root OK ===== " + echo " ===== etc-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/fast-two-pool-test b/regress/tests/fast-two-pool-test new file mode 100755 index 0000000000..51efc8b945 --- /dev/null +++ b/regress/tests/fast-two-pool-test @@ -0,0 +1,70 @@ +#!/bin/sh +# +# This is Arno's test. It uses two pools, two tapes, and +# an autochanger. Note, the Director has three Pools in its +# conf: Default, Full, and Inc. Default is used in the +# NightlySave job by default. What is backed up is what +# is in ${cwd}/tmp/file-list, which is by default the Bacula +# source code (i.e. the build directory). +# +# Note, we use the virtual disk autochanger. +# +TestName="fast-two-pool-test" +JobName=Fast-two-pool +. scripts/functions + +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks + +# Make a relatively large backup set 5 x source code directory +# Reduced to 1 for portable +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +# Write out bconsole commands to a file +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=150 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +list volumes +@# Start job with Client run before and sleep +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +@# wait between starting jobs +@sleep 10 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave1 level=Full pool=Full yes +run job=NightlySave1 level=Full pool=Full yes +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +# exit +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/fifo-test b/regress/tests/fifo-test new file mode 100755 index 0000000000..e994caeafc --- /dev/null +++ b/regress/tests/fifo-test @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Attempt to backup from a fifo and restore to a fifo +# +TestName="fifo-test" +JobName=FIFOTest +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/bfifo" >${cwd}/tmp/file-list + +rm -f ${cwd}/tmp/bfifo +mkfifo ${cwd}/tmp/bfifo +# send a file into the fifo +file=encrypt-bug.jpg +cat ${file} >${cwd}/tmp/bfifo& + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume001 +run job=$JobName storage=File1 yes +wait +messages +quit +END_OF_DATA + + +run_bacula + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +@#setdebug level=50 client +restore where=/ select all storage=File1 done +yes +wait +messages +@$out +quit +END_OF_DATA + +cat <${cwd}/tmp/bfifo >${cwd}/tmp/${file}& + +run_bconsole + +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +diff ${file} ${cwd}/tmp/${file} +dstat=$? +end_test diff --git a/regress/tests/fixed-block-size-tape b/regress/tests/fixed-block-size-tape new file mode 100755 index 0000000000..6799b543b2 --- /dev/null +++ b/regress/tests/fixed-block-size-tape @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where we set the minimum and maximum block +# sizes. +# +TestName="fixed-block-size-tape" +JobName=fixedblocksize +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +echo "s%# Maximum Block Size% Maximum Block Size%" >${cwd}/tmp/2 +echo "s%# Minimum Block Size% Minimum Block Size%" >>${cwd}/tmp/2 +sed -f ${cwd}/tmp/2 ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf +if [ $? != 0 ] ; then + echo " " + echo " " + echo "!!!! sed problem in Fixed Block Size test !!!!!" + echo " " + exit 1 +fi +rm -f ${cwd}/tmp/1 ${cwd}/tmp/2 + +change_jobname NightlySave $JobName +start_test + + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +setdebug level=51 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/four-concurrent-jobs-tape b/regress/tests/four-concurrent-jobs-tape new file mode 100755 index 0000000000..9461a217b9 --- /dev/null +++ b/regress/tests/four-concurrent-jobs-tape @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Run four jobs at the same time +# +TestName="four-concurrent-jobs-tape" +JobName=FourConcurrentJobs +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +@sleep 2 +status dir +@sleep 5 +status dir +status storage=DDS-4 +messages +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/four-concurrent-jobs-test b/regress/tests/four-concurrent-jobs-test new file mode 100755 index 0000000000..5190dfce6d --- /dev/null +++ b/regress/tests/four-concurrent-jobs-test @@ -0,0 +1,94 @@ +#!/bin/sh +# +# Run four jobs at the same time, with two Volumes. +# Set max Vol bytes of first volume +# to less than total backup to force Bacula to use the second +# Volume. +# +TestName="four-concurrent-jobs-test" +JobName=Four-concurrent-jobs +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 +TestVolume001 +label storage=File1 +TestVolume002 +update Volume=TestVolume001 MaxVolBytes=100000000 +@#50000000 +@#12 +setdebug level=51 Storage=File1 +status storage=File1 +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=File1 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=File1 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName level=Full Storage=File1 +yes +reload +llist volume=TestVolume001 +llist volume=TestVolume002 +status storage=File1 +run job=$JobName level=Full Storage=File1 +yes +status storage=File1 +reload +reload +reload +reload +@sleep 2 +status dir +status storage=File1 +llist volume=TestVolume001 +llist volume=TestVolume002 +reload +@sleep 5 +messages +reload +reload +wait +status storage=File1 +reload +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +reload +reload +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/four-jobs-tape b/regress/tests/four-jobs-tape new file mode 100755 index 0000000000..6d07d53171 --- /dev/null +++ b/regress/tests/four-jobs-tape @@ -0,0 +1,152 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then finally restore. +# It should require at least 4 different bsrs. +# +TestName="four-jobs-tape" +JobName=fourjobstape +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +estimate job=$JobName listing +estimate job=$JobName listing +estimate job=$JobName listing +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +# +# run a second job +# +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 2 done" +touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a third job +# +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 3 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a fourth job +# +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 4 done" +# +# now do several restores to ensure we cleanup between jobs +# +cat <${cwd}/tmp/bconcmds +@$out /dev/null +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +@$out ${cwd}/tmp/log2.out +@# +@# now unmount the tape and start two restores +@# at the same time +@# +unmount storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +mount storage=DDS-4 +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/four-jobs-test b/regress/tests/four-jobs-test new file mode 100755 index 0000000000..9af909d8b8 --- /dev/null +++ b/regress/tests/four-jobs-test @@ -0,0 +1,123 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then finally restore. +# It should require at least 4 different bsrs. +# +TestName="four-jobs-test" +JobName=SpanVol +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +estimate job=$JobName listing +estimate job=$JobName listing +estimate job=$JobName listing +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +# +# run a second job +# +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File + +echo "Backup 2 done" +touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a third job +# +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/log1.out +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File + +echo "Backup 3 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a fourth job +# +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/log1.out +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File + +echo "Backup 4 done" +# +# now do several restores to ensure we cleanup between jobs +# +cat <${cwd}/tmp/bconcmds +@output /dev/null +restore where=${cwd}/tmp/bacula-restores select all storage=File done +yes +wait +restore where=${cwd}/tmp/bacula-restores select all storage=File done +yes +wait +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/gigaslam-sparse-test b/regress/tests/gigaslam-sparse-test new file mode 100755 index 0000000000..f3b560af07 --- /dev/null +++ b/regress/tests/gigaslam-sparse-test @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the Sparse option +# then restore it. +# +TestName="gigaslam-sparse-test" +JobName=SparseTest +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list +cd ${cwd}/build/src/tools +./gigaslam +if [ $? != 0 ]; then + echo "Execute of ${cwd}/build/src/tools/gigaslam failed." + rm -f ${cwd}/build/src/tools/gigaslam.gif + exit 1 +fi +cd ${cwd} + +start_test + +cat >${cwd}/tmp/bconcmds <${cwd}/tmp/file-list +echo "${cwd}/weird-files" >>${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File +TestVolume001 +run job=$JobName +yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File +5 +cd ${cwd}/weird-files/subdir +mark another-hardlink +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +diff ${cwd}/weird-files/subdir/another-hardlink \ + ${cwd}/tmp/bacula-restores/${cwd}/weird-files/subdir/another-hardlink 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/tests/incremental-2disk b/regress/tests/incremental-2disk new file mode 100755 index 0000000000..63098bcd9b --- /dev/null +++ b/regress/tests/incremental-2disk @@ -0,0 +1,104 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +# This script uses the virtual disk autochanger +# +TestName="incremental-2disk" +JobName=Inc2disk +. scripts/functions + + +stop_bacula +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +scripts/copy-2disk-confs +scripts/prepare-two-disks + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname $JobName +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=Incremental job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=File +stop_bacula +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c + +check_two_logs +check_restore_tmp_build_diff + +# +# This script seems to more or less randomly fail, so we +# add extra code here to produce a "dump" in the event of +# an error. +# +if [ $dstat != 0 -o $bstat != 0 -o $rstat != 0 ] ; then + cat ${cwd}/tmp/log1.out + echo " " + cat ${cwd}/tmp/log2.out + echo " " + diff -r ${cwd}/tmp/build ${cwd}/tmp/bacula-restores${cwd}/tmp/build +fi + +end_test diff --git a/regress/tests/incremental-2media b/regress/tests/incremental-2media new file mode 100755 index 0000000000..902f1df5a0 --- /dev/null +++ b/regress/tests/incremental-2media @@ -0,0 +1,73 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental onto a different medium +# and then restore everything. +# +# This script uses the virtual disk autochanger +# +TestName="incremental-2media" +JobName=Inc2media +. scripts/functions + + +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=File volume=TestVolume002 Pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +setdebug level=51 storage=File +run level=Incremental job=$JobName storage=File yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +setdebug level=51 storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff + +end_test diff --git a/regress/tests/incremental-2media-tape b/regress/tests/incremental-2media-tape new file mode 100755 index 0000000000..65014880f8 --- /dev/null +++ b/regress/tests/incremental-2media-tape @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental onto a different medium +# and then restore everything. +# +# This script uses the two different tape drives. +# +TestName="incremental-2media-tape" +JobName=Inc2mediaTape +. scripts/functions + + +scripts/cleanup +# Get conf files +/bin/cp -f scripts/bacula-dir-2d.conf bin/bacula-dir.conf +/bin/cp -f scripts/bacula-sd-2d.conf bin/bacula-sd.conf +/bin/cp -f scripts/bacula-fd-2d.conf bin/bacula-fd.conf +/bin/cp -f scripts/bconsole-2d.conf bin/bconsole.conf + +# get proper SD tape definitions +cp -f scripts/linux_tape_options bin/tape_options +if test x`uname` = xFreeBSD ; then + cp -f scripts/freebsd_tape_options bin/tape_options +fi + +mt -f /dev/nst0 rewind +mt -f /dev/nst0 weof +mt -f /dev/nst1 rewind +mt -f /dev/nst1 weof + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DLT80 volume=TestVolume002 Pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula + +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +setdebug level=51 storage=DLT80 +run level=Incremental job=$JobName storage=DLT80 yes +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +setdebug level=51 storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=DLT80 +stop_bacula + +check_two_logs +check_restore_diff + +end_test diff --git a/regress/tests/incremental-2tape b/regress/tests/incremental-2tape new file mode 100755 index 0000000000..67d4211a20 --- /dev/null +++ b/regress/tests/incremental-2tape @@ -0,0 +1,110 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +# This script uses the autochanger and two tapes +# +. scripts/functions +if test x${AUTOCHANGER} = x/dev/null ; then + echo "incremental-2tape test skipped. No autochanger." + exit +fi +debug=0 +if test "$debug" -eq 1 ; then + out="tee" +else + out="output" +fi +cwd=`pwd` +bin/bacula stop 2>&1 >/dev/null +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +scripts/copy-2tape-confs +scripts/cleanup-2tape +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +echo " " +echo " " +echo " === Starting incremental-2tape test ===" +echo " === Starting incremental-2tape test ===" >>working/log +echo " " + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0 +run job=NightlySave yes +wait +messages +quit +END_OF_DATA + +if test "$debug" -eq 1 ; then + bin/bacula start + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +grep "^ Termination: *Backup OK" ${cwd}/tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Restore OK" ${cwd}/tmp/log2.out 2>&1 >/dev/null +rstat=$? +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c +diff -r ${cwd}/tmp/build ${cwd}/tmp/bacula-restores${cwd}/tmp/build 2>&1 >/dev/null +if [ $? != 0 -o $bstat != 0 -o $rstat != 0 ] ; then + echo " " + echo " " + echo " !!!!! incremental-2tape test Bacula source failed!!! !!!!! " + echo " !!!!! incremental-2tape test failed!!! !!!!! " >>test.out + echo " " +else + echo " ===== incremental-2tape test Bacula source OK ===== " + echo " ===== incremental-2tape test OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/incremental-tape b/regress/tests/incremental-tape new file mode 100755 index 0000000000..bd9141e19d --- /dev/null +++ b/regress/tests/incremental-tape @@ -0,0 +1,75 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +TestName="incremental-tape" +JobName=IncTape +. scripts/functions + +copy_tape_confs + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/incremental-test b/regress/tests/incremental-test new file mode 100755 index 0000000000..a5149051f6 --- /dev/null +++ b/regress/tests/incremental-test @@ -0,0 +1,170 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +TestName="incremental-test" +JobName=Incremental +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +mkdir ${cwd}/tmp/build +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=100 storage=File +label storage=File volume=TestVolume001 +label storage=File volume=TestVolume002 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +# +# Now create two new files to be restored later +# +sleep 1 +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +cp -f ${cwd}/tmp/build/dird.c ${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=Differential job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +sleep 1 +touch ${cwd}/tmp/build/ficheriro1.txt +touch ${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +sleep 1 +cd ${cwd}/tmp/build +cp -f ficheriro2.txt 1 +sed "s%a%b%g" 1 >ficheriro2.txt +rm -f 1 +cd ${cwd} +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Differential job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +sleep 1 +touch ${cwd}/tmp/build/ficheriro1.txt +touch ${cwd}/tmp/build/ficheriro2.txt +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +sleep 1 +touch ${cwd}/tmp/build/ficheriro1.txt +touch ${cwd}/tmp/build/ficheriro2.txt +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole + +sleep 1 +touch ${cwd}/tmp/build/ficheriro1.txt +touch ${cwd}/tmp/build/ficheriro2.txt +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +sleep 1 +touch ${cwd}/tmp/build/ficheriro1.txt +touch ${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@output ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/lib-tape-root b/regress/tests/lib-tape-root new file mode 100755 index 0000000000..b02c15284f --- /dev/null +++ b/regress/tests/lib-tape-root @@ -0,0 +1,68 @@ +#!/bin/sh +# +# Run a simple backup of the /lib directory +# then restore it. +# +cwd=`pwd` +. scripts/functions +bin/bacula stop 2>&1 >/dev/null +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "/lib" >${cwd}/tmp/file-list +echo " " +echo " " +echo " === Starting lib-tape-root test ===" +echo " " +echo " " +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 1>/dev/nul +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== lib-tape-root failed!!! ===== " + echo " ===== lib-tape-root failed!!! ===== " >>test.out + echo " " +else + echo " ===== lib-tape-root OK ===== " + echo " ===== lib-tape-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/lib-test-root b/regress/tests/lib-test-root new file mode 100755 index 0000000000..54da62c7d4 --- /dev/null +++ b/regress/tests/lib-test-root @@ -0,0 +1,73 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="lib-test-root" +. scripts/functions + +require_root + + +scripts/cleanup +scripts/copy-test-confs +echo "/lib" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@output ${cwd}/tmp/log1.out +label storage=File +TestVolume001 +run job=NightlySave +yes +wait +messages +@# +@# now do a restore +@# +@output ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +# more cleanup to be done below + +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! lib-test-root failed !!!! ===== " + echo " ===== !!!! lib-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== lib-test-root OK ===== " + echo " ===== lib-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/maxtime-test b/regress/tests/maxtime-test new file mode 100755 index 0000000000..0452a867c4 --- /dev/null +++ b/regress/tests/maxtime-test @@ -0,0 +1,80 @@ +#!/bin/sh +# +# Test RunScript +# + +TestName="maxtime-test" +JobName=backup + +. scripts/functions + +copy_test_confs + +rm -f bin/bacula-dir.conf +rm -f ${cwd}/tmp/RUN*log +/bin/cp -f scripts/bacula-dir.conf.maxtime bin/bacula-dir.conf +WHEN=$(date '+%Y-%m-%d %H:%M:%S') + +echo "${cwd}/build/po" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +label volume=TestVolume001 pool=PoolA +@$out ${cwd}/tmp/RUN_MAXTIME.log +@# no media => have to wait +run job=RUN_MAXWAITTIME pool=Default yes +@sleep 2 +@# storage is used by RUN_MAXWAITTIME => have to wait +run job=RUN_MAXSTARTDELAY pool=PoolA when="$WHEN" yes +wait +messages +run job=RUN_MAXRUNTIME pool=PoolA yes +wait +messages +st dir +quit +END_OF_DATA + +(mkfifo ${cwd}/tmp/fifo + mkfifo ${cwd}/tmp/fifo2 + mkfifo ${cwd}/tmp/fifo3) 2> /dev/null + +bin/bacula start +cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf > /dev/null +stop_bacula + +rm ${cwd}/tmp/fifo ${cwd}/tmp/fifo2 ${cwd}/tmp/fifo3 + +export dstat=0 +export bstat=0 +export rstat=0 + +if grep -e 'RUN_MAXWAITTIME.* Fatal error: Max wait time exceeded. Job canceled.' ${cwd}/tmp/RUN_MAXTIME.log >/dev/null 2>&1 +then + [ "$debug" = 1 ] && echo MAXWAITTIME ok +else + echo "MAXWAITTIME in error" + rstat=1 +fi + +if grep -e 'RUN_MAXSTARTDELAY.* Fatal error: Job canceled because max start delay time exceeded.' ${cwd}/tmp/RUN_MAXTIME.log && + ! grep -e 'NEVER start this' ${cwd}/tmp/RUN_MAXTIME.log >/dev/null 2>&1 +then + [ "$debug" = 1 ] && echo MAXSTARTDELAY ok +else + echo "MAXSTARTDELAY in error" + rstat=1 +fi + +if grep -e 'RUN_MAXRUNTIME.* Fatal error: Max run time exceeded. Job canceled.' ${cwd}/tmp/RUN_MAXTIME.log >/dev/null 2>&1 +then + [ "$debug" = 1 ] && echo MAXRUNTIME ok +else + echo "MAXRUNTIME in error" + rstat=1 +fi + +end_test diff --git a/regress/tests/maxvol-test b/regress/tests/maxvol-test new file mode 100755 index 0000000000..1e29f85f38 --- /dev/null +++ b/regress/tests/maxvol-test @@ -0,0 +1,64 @@ +#!/bin/sh +# +# Run four jobs at the same time, with four Volumes, but set +# Maximum Job Volumes = 1 on each of the Volumes. Note, +# Volume 2 will probably have two jobs on it. Something to +# be fixed in a later version. +# +TestName="maxvol-test" +JobName=maxvol +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp -f ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +sed "s%# Maximum Volume Jobs% Maximum Volume Jobs%" ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume003 +label storage=File1 volume=TestVolume004 +update Volume=TestVolume001 MaxVolBytes=100000000 +@#50000000 +@#12 +setdebug level=100 Storage=File1 +run job=$JobName level=Full Storage=File1 yes +run job=$JobName level=Full Storage=File1 yes +run job=$JobName level=Full Storage=File1 yes +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +reload +reload +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/memory-bug-tape b/regress/tests/memory-bug-tape new file mode 100755 index 0000000000..6ae57fed6e --- /dev/null +++ b/regress/tests/memory-bug-tape @@ -0,0 +1,20058 @@ +#!/bin/sh +# +# Do a whole lot of select commands. This test is one where the +# Director should be run under valgrind. This exercises SQL a bit +# and helps detect orphaned buffers (the SQL engine library code is not +# protected by smartall. +# +TestName="four-concurrent-jobs-tape" +JobName=FourConcurrentJobs +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full Storage=DDS-4 yes +sql +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * from File; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +SELECT * FROM Media; +@sleep 2 +status dir +@sleep 5 +status dir +status storage=DDS-4 +messages +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/migration-job-test b/regress/tests/migration-job-test new file mode 100755 index 0000000000..69cbe43dc3 --- /dev/null +++ b/regress/tests/migration-job-test @@ -0,0 +1,84 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then migrate it +# to another device. +# +# This script uses the virtual disk autochanger +# +TestName="migration-job-test" +JobName=MigrationJobSave +. scripts/functions + + +scripts/cleanup +scripts/copy-migration-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +# +# Note, we first backup into Pool Default, +# then Migrate into Pool Full. +# Pool Default uses Storage=File +# Pool Full uses Storage=DiskChanger + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=100 storage=File +label storage=File volume=FileVolume001 Pool=Default +label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 +label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 +@# run two jobs (both will be migrated) +run job=$JobName yes +run job=$JobName yes +wait +list jobs +list volumes +@#setdebug level=100 dir +@# should migrate two jobs +@#setdebug level=51 storage=DiskChanger +run job=migrate-job yes +wait +messages +@# purge volume=FileVolume001 +list jobs +list volumes +wait +@# +@# Now do another backup, but level Incremental +@# +run job=$JobName level=Incremental yes +wait +messages +@# +@# This final job that runs should be Incremental and +@# not upgraded to full. +list jobs +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +list volumes +restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/migration-jobspan-test b/regress/tests/migration-jobspan-test new file mode 100755 index 0000000000..6910dde4bd --- /dev/null +++ b/regress/tests/migration-jobspan-test @@ -0,0 +1,81 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then migrate it +# to another device. +# +# Test migrating a job that spans two Volumes +# +# This script uses the virtual disk autochanger +# +TestName="migration-jobspan-test" +JobName=MigrationJobSpanSave +. scripts/functions + + +scripts/cleanup +scripts/copy-migration-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + + +change_jobname NightlySave $JobName +start_test + +# +# Note, we first backup into Pool Default, +# then Migrate into Pool Full. +# Pool Default uses Storage=File +# Pool Full uses Storage=DiskChanger + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=10 dir +@#setdebug level=100 storage=File +label storage=File volume=FileVolume001 Pool=Default +label storage=File volume=FileVolume002 Pool=Default +update Volume=FileVolume001 MaxVolBytes=3000000 pool=Default +label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 +label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 +list volumes +@# +run job=$JobName yes +@#run job=$JobName yes +wait +list volumes +@#setdebug level=200 dir +@# should migrate both Volumes +run job=migrate-job yes +wait +purge volume=FileVolume001 +purge volume=FileVolume002 +list volumes +list jobs +messages +wait +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/migration-occupancy-test b/regress/tests/migration-occupancy-test new file mode 100755 index 0000000000..5f19481677 --- /dev/null +++ b/regress/tests/migration-occupancy-test @@ -0,0 +1,70 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then migrate it +# to another device. +# +# This script uses the virtual disk autochanger +# +TestName="migration-occupancy-test" +JobName=MigrationJobSave +. scripts/functions + + +scripts/cleanup +scripts/copy-migration-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +# +# Note, we first backup into Pool Default, +# then Migrate into Pool Full. +# Pool Default uses Storage=File +# Pool Full uses Storage=DiskChanger + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=FileVolume001 Pool=Default +label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 +label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 +list volumes +@# run two jobs (both will be migrated) +run job=$JobName yes +run job=$JobName yes +wait +update volume=FileVolume001 VolStatus=Used +list volumes +@# should migrate two jobs +run job=migrate-occupancy yes +list volumes +wait +messages +purge volume=FileVolume001 +wait +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/migration-time-test b/regress/tests/migration-time-test new file mode 100755 index 0000000000..99de021cf2 --- /dev/null +++ b/regress/tests/migration-time-test @@ -0,0 +1,77 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then migrate it +# to another device. +# +# This script uses the virtual disk autochanger +# +TestName="migration-time-test" +JobName=MigrationJobSave +. scripts/functions + + +scripts/cleanup +scripts/copy-migration-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +# +# Note, we first backup into Pool Default, +# then Migrate into Pool Full. +# Pool Default uses Storage=File +# Pool Full uses Storage=DiskChanger + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=FileVolume001 Pool=Default +label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 +label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 +list volumes +@# run three jobs +run job=$JobName level=Full yes +run job=$JobName level=Full yes +run job=$JobName level=Full yes +wait +update volume=FileVolume001 VolStatus=Used +sql +update Job SET RealEndTime='2004-01-01 12:01:01' WHERE JobId IN (2,3); + +llist jobid=2,3 +list jobs +list volumes +@# should migrate only jobid=2 and 3 +run job=migrate-time yes +wait +messages +wait +purge volume=FileVolume001 +list jobs +list volumes +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/migration-volume-test b/regress/tests/migration-volume-test new file mode 100755 index 0000000000..2d5e57885c --- /dev/null +++ b/regress/tests/migration-volume-test @@ -0,0 +1,102 @@ +#!/bin/sh +# +# Run a backup of the Bacula build directory on two Volumes +# then migrate it to another device. +# +# This script uses the virtual disk autochanger +# +TestName="migration-volume-test" +JobName=MigVolBackup +. scripts/functions + + +scripts/cleanup +scripts/copy-migration-confs +scripts/prepare-two-disks +echo "${cwd}/build" >${cwd}/tmp/file-list +#cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +#sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +# +# Note, we first backup into Pool Default, +# then Migrate into Pool Full. +# Pool Default uses Storage=File +# Pool Full uses Storage=DiskChanger + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=FileVolume001 Pool=Default +label storage=File volume=FileVolume002 Pool=Default +update Volume=FileVolume001 MaxVolBytes=3000000 pool=Default +label storage=DiskChanger volume=ChangerVolume001 slot=1 Pool=Full drive=0 +label storage=DiskChanger volume=ChangerVolume002 slot=2 Pool=Full drive=0 +@# +run job=$JobName yes +wait +run job=$JobName yes +wait +update volume=FileVolume001 VolStatus=Used +update volume=FileVolume002 VolStatus=Used +@#list volumes +@#list jobs +@# should migrate two jobs +@# setdebug level=11 dir +@echo "Run migrate-volume Job" +@#setdebug level=100 dir +run job=migrate-volume yes +@sleep 5 +list jobs +llist jobid=1 +llist jobid=2 +llist jobid=3 +llist jobid=4 +llist jobid=5 +status storage=DiskChanger +wait +list volumes +list jobs +llist jobid=1 +llist jobid=2 +llist jobid=3 +llist jobid=4 +llist jobid=5 +sql +select * from JobMedia where JobId=1; + +@# Now run a second Migration job, which should do nothing +run job=migrate-volume yes +wait +list jobs +@# ensure we don't pickup old backup by purging volume +@# purge volume=FileVolume001 +@# purge volume=FileVolume002 +@echo "Now do a restore" +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DiskChanger +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/multi-client-test b/regress/tests/multi-client-test new file mode 100755 index 0000000000..fb61105d19 --- /dev/null +++ b/regress/tests/multi-client-test @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Run four jobs at the same time, with two Volumes. +# Set max Vol bytes of first volume +# to less than total backup to force Bacula to use the second +# Volume. +# +TestName="multi-client-test" +JobName=Multi-client +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +/bin/cp -f scripts/multi-client-bacula-dir.conf bin/bacula-dir.conf + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Make sure we can contact all clients +@#setdebug level=100 dir +status client=${HOST}-fd +status client=${hostname1}-fd +status client=${hostname2}-fd +status client=${hostname3}-fd +setdebug level=1 dir +label storage=File1 +TestVolume001 +label storage=File1 +TestVolume002 +update Volume=TestVolume001 MaxVolBytes=900000000 +status storage=File1 +@#llist volume=TestVolume001 +@#llist volume=TestVolume002 +run job=${hostname1} level=Full Storage=File1 yes +run job=${hostname2} level=Full Storage=File1 yes +@# run job=${hostname3} level=Full Storage=File1 yes +status storage=File1 +run job=$JobName level=Full Storage=File1 yes +@sleep 2 +status dir +status storage=File1 +@sleep 5 +messages +wait +status storage=File1 +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores client=${hostname}-fd select storage=File1 +unmark * +mark * +done +yes +wait +messages +@output +status dir +status storage=File1 +quit +END_OF_DATA + +run_bacula +stop_bacula + +check_two_logs +#if test "$debug" -eq 1 ; then +# diff -r ${hostname_files} ${cwd}/tmp/bacula-restores/${hostname_files} +#else +# diff -r ${hostname_files} ${cwd}/tmp/bacula-restores/${hostname_files} 2>&1 >/dev/null +#fi +#dstat=$? +dstat=0 +end_test diff --git a/regress/tests/query-test b/regress/tests/query-test new file mode 100755 index 0000000000..a4d365e1fe --- /dev/null +++ b/regress/tests/query-test @@ -0,0 +1,120 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do a Differental then a bunch of query commands +# and finally restore the two files. +# +TestName="query-test" +JobName=query +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +mkdir ${cwd}/tmp/build +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +label storage=File volume=TestVolume002 +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@# Force differental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=differental job=$JobName yes +wait +messages +@output +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run level=incremental job=$JobName yes +wait +messages +@# +@# Now do the queries +@# +query +1 +ficheriro1.txt +query +2 +${cwd}/tmp/build/ +ficheriro1.txt +localhost-fd +query +6 +TestVolume001 +query +7 +1 +query +8 +localhost-fd +query +9 +Default +query +10 +query +11 +query +12 +1 +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore-list +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +# +# Delete .c files because we will only restored the txt files +# +rm -f ${cwd}/tmp/build/*.c + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/recycle-test b/regress/tests/recycle-test new file mode 100755 index 0000000000..a42151517f --- /dev/null +++ b/regress/tests/recycle-test @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# create three volumes and do six backups causing the +# volumes to be recycled, and cycling through the volumes +# twice. Tests maxvoljobs and volretention. +# +TestName="recycle-test" +JobName=Recycle +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume003 +update Volume=TestVolume001 volretention=10s +update Volume=TestVolume001 maxvoljobs=1 +update Volume=TestVolume002 volretention=10s +update Volume=TestVolume002 maxvoljobs=1 +update Volume=TestVolume003 volretention=10s +update Volume=TestVolume003 maxvoljobs=1 +list volumes +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +@sleep 10 +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +run job=$JobName storage=File1 level=full yes +wait +messages +list volumes +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/regexwhere-test b/regress/tests/regexwhere-test new file mode 100755 index 0000000000..692bd60b36 --- /dev/null +++ b/regress/tests/regexwhere-test @@ -0,0 +1,291 @@ +#!/bin/sh +# +# Test file relocation feature +# + +TestName="regexwhere-test" +JobName=backup + +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs + +/bin/cp -f scripts/bacula-dir.conf.regexwhere bin/bacula-dir.conf + +echo "${cwd}/build/po" >tmp/file-list + +start_test + +cat <tmp/bconcmds +@$out tmp/RUN_backup +messages +label volume=TestVolume001 +run job=backup yes +wait +messages +@################################## +@$out tmp/RUN_JobA +restore +5 +cd ${cwd}/build/po +m *.po +done +1 +yes +wait +messages +@################################## +@$out tmp/RUN_JobB +restore +5 +cd ${cwd}/build/po +m *.po +done +2 +yes +wait +messages +@################################## +@$out tmp/RUN_JobC +restore +5 +cd ${cwd}/build/po +m *.po +done +3 +yes +wait +messages +@################################## +@$out tmp/RUN_JobD +restore +5 +cd ${cwd}/build/po +m *.po +done +4 +yes +wait +messages +@################################## +@$out tmp/RUN_JobE +restore +5 +cd ${cwd}/build/po +m *.po +done +5 +yes +wait +messages +@################################## +@$out tmp/RUN_JobF +restore +5 +cd ${cwd}/build/po +m *.po +done +6 +yes +wait +messages +@################################## +@$out tmp/RUN_JobG +restore strip_prefix="${cwd}" add_prefix="/tmp/bacula-restore" +5 +cd ${cwd}/build/po +m *.po +done +7 +yes +wait +messages +@################################## +@$out tmp/RUN_JobH +restore add_suffix=.old +5 +cd ${cwd}/build/po +m *.po +done +7 +yes +wait +messages +@################################## +@$out tmp/RUN_JobI +restore regexwhere="!Po!old!i,!old!po!,!\$!.old!" +5 +cd ${cwd}/build/po +m *.po +done +7 +yes +wait +messages +@################################## +@$out tmp/RUN_JobJ +restore +5 +cd ${cwd}/build/po +m *.po +done +7 +mod +@## File Relocation -> add suffix -> test -> accept +10 +3 +.old +5 +/etc/passwd +. +6 +@## Where +m +9 +tmp/bacula-restore-it +m +@## use add suffix +10 +3 +.old +6 +yes +wait +messages +@sleep 1 +quit +END_OF_DATA + +run_bacula + +stop_bacula + + +dstat=0 +bstat=0 +rstat=0 +export dstat +export bstat +export rstat + +J=JobA +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "${cwd}/build/po/fr.old.po" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobB +# $cwd begins with / +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "tmp/bacula-restore${cwd}/po/fr.po.old" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobC +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "tmp/bacula-restore${cwd}/build/po/fr.po" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobD +if grep -q "Restore Error" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobE +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "${cwd}/tmp/fr.po" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobF +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "${cwd}/build/po/fr.po" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobG +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "tmp/bacula-restore/build/po/fr.po" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobH +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "${cwd}/build/po/fr.po.old" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +J=JobI +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "${cwd}/build/po/fr.po.old" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + + +J=JobJ +if grep -q "Restore OK" tmp/RUN_$J && + grep -q "/etc/passwd.old" tmp/RUN_$J && + grep -q -e "Where: *tmp/bacula-restore-it" tmp/RUN_$J && + grep -q "${cwd}/build/po/fr.po.old" tmp/RUN_$J +then + [ "$debug" = 1 ] && echo $J ok +else + echo "$J in error" + rstat=1 +fi + +# test with bregtest + +find ${cwd}/build > tmp/list +# thanks to BSD like system for that... +sed -e 's/[Rr][Ee][Aa][Dd][Mm][Ee]/readme/' -e 's/\([ch]\)$/.old.\1/' tmp/list > tmp/list.sed +./build/src/tools/bregtest -s -f tmp/list -e '/readme/readme/i,/([ch])$/.old.$1/' > tmp/list.bsed + +if diff tmp/list.bsed tmp/list.sed >/dev/null 2>&1 +then + [ "$debug" = 1 ] && echo bregtest ok +else + echo "bregtest test in error" + rstat=1 + +fi + +end_test diff --git a/regress/tests/relabel-tape b/regress/tests/relabel-tape new file mode 100755 index 0000000000..15b22c66a1 --- /dev/null +++ b/regress/tests/relabel-tape @@ -0,0 +1,94 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then finally restore. +# It should require at least 4 different bsrs. +# +TestName="relabel-tape" +JobName=Relabeltape +. scripts/functions + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full yes +wait +messages +add pool=Default storage=DDS-4 +0 +TestVolume002 +@# set status to append +update volume=TestVolume001 +1 +. +run job=$JobName level=Full yes +wait +unmount storage=DDS-4 +unmount storage=DDS-4 +@#setdebug level=150 storage=DDS-4 +purge volume=TestVolume001 +relabel oldvolume=TestVolume001 volume=TestVolume003 slot=0 pool=Default storage=DDS-4 +list volumes +mount storage=DDS-4 +messages +wait +run job=$JobName level=Full yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + + +echo "Backup done" +# +# now do several restores to ensure we cleanup between jobs +# +cat <${cwd}/tmp/bconcmds +@$out /dev/null +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +@$out ${cwd}/tmp/log2.out +@# +@# now unmount the tape and start two restores +@# at the same time +@# +unmount storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +mount storage=DDS-4 +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/restore-by-file-tape b/regress/tests/restore-by-file-tape new file mode 100755 index 0000000000..2eb84d8150 --- /dev/null +++ b/regress/tests/restore-by-file-tape @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where the maximum tape file size is set to 1M +# then restore a few files from it. Note, by setting the maximum +# file size to 1M, it runs very slow. There are about 64 files that +# are created during each of the two backups. +# +TestName="restore-by-file-tape" +JobName=restorebyfile +. scripts/functions +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list +sed s%\^%${cwd}% ${cwd}/scripts/flist | sort | uniq >${cwd}/tmp/restore2-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 file=<${cwd}/tmp/restore2-list +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +dstat=0 +# +# We need to stop and start Bacula to +# test appending to a previously written tape +# +for i in `cat ${cwd}/tmp/restore2-list`; do + diff $i ${cwd}/tmp/bacula-restores$i + if [ $? != 0 ] ; then + dstat=1 + fi +done + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +run job=$JobName level=Full yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore2-list + +yes +wait +messages +@output +quit +END_OF_DATA + +# +# Bacula was stopped, but we must restart it to +# test appending to a previously written tape +# +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs + +scripts/check_for_zombie_jobs storage=DDS-4 +bin/bacula stop 2>&1 >/dev/null +for i in `cat ${cwd}/tmp/restore2-list`; do + diff $i ${cwd}/tmp/bacula-restores$i + if [ $? != 0 ] ; then + dstat=1 + fi +done + +end_test diff --git a/regress/tests/restore-by-file-test b/regress/tests/restore-by-file-test new file mode 100755 index 0000000000..ec5a70fc22 --- /dev/null +++ b/regress/tests/restore-by-file-test @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then restore it. +# + +TestName="restore-by-file-test" +JobName=restorebyfile +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +mkdir ${cwd}/tmp/build +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp/build +ls >../1 +cd .. +sed s%\^%${cwd}/tmp/build/% 1 | sort | uniq >restore-list +rm -f 1 +cd ${cwd} + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/restore-disk-seek-test b/regress/tests/restore-disk-seek-test new file mode 100755 index 0000000000..38fc0f7b7b --- /dev/null +++ b/regress/tests/restore-disk-seek-test @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Run a backup of the full bacula build directory, but with the +# Maximum File Size set. Then do a restore of a few files to kick in +# disk seeking (not yet enabled), and ensure that the restored files +# match. Even though disk seeking is not yet enabled, this is a good test, +# and once it is enabled, this will test it. +# +TestName="restore-disk-seek-test" +JobName=restore-disk-seek +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +# Copy only the .c files (to be restored) +# set files to "*.c" for all c files +files="ua_tree.c ua_update.c" +# files="*.c" +for i in ${files}; do + cp -p ${cwd}/build/src/dird/${i} ${cwd}/tmp/build +done +cd ${cwd}/tmp/build +ls >../1 +cd .. +sed s%\^%${cwd}/tmp/build/% 1 | sort | uniq >restore-list +# +# At this point restore-list contains the list +# of files we will restore +# +rm -f 1 +cd ${cwd} +# +# Now arrange to backup *everything* +# +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +cp -fp ${cwd}/build/src/dird/* ${cwd}/tmp/build +# +# Enable MaximumFileSize to ensure lots of JobMedia records and thus +# lots of seeking +# +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +setdebug level=30 fd +setdebug level=11 storage=File +sql +@# print the JobMedia records +select * from JobMedia; + +restore bootstrap=${cwd}/tmp/kern.bsr where=${cwd}/tmp/bacula-restores storage=File +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +# Now setup a control directory of only what we *should* restore +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +for i in ${files}; do + cp -p ${cwd}/build/src/dird/${i} ${cwd}/tmp/build +done + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/restore-seek-tape b/regress/tests/restore-seek-tape new file mode 100755 index 0000000000..aa394beb60 --- /dev/null +++ b/regress/tests/restore-seek-tape @@ -0,0 +1,92 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where the maximum tape file size is set to 1M +# then restore a few files from it. Note, by setting the maximum +# file size to 1M, it runs very slow. This tests the +# seeking capability +# +TestName="restore-seek-tape" +JobName=restore-tape-seek +. scripts/functions + +copy_tape_confs +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +# Copy only the .c files (to be restored) +# set files to "*.c" for all c files +files="ua_tree.c ua_update.c" +# files="*.c" +for i in ${files}; do + cp -p ${cwd}/build/src/dird/${i} ${cwd}/tmp/build +done +cd ${cwd}/tmp/build +ls >../1 +cd .. +sed s%\^%${cwd}/tmp/build/% 1 | sort | uniq >restore-list +# +# At this point restore-list contains the list +# of files we will restore +# +rm -f 1 +cd ${cwd} +# +# Now arrange to backup *everything* +# +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +cp -fp ${cwd}/build/src/dird/* ${cwd}/tmp/build +# +# Enable MaximumFileSize to ensure lots of JobMedia records and thus +# lots of seeking +# +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size = 1000000% Maximum File Size = 10KB%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 pool=Default +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +setdebug level=30 fd +setdebug level=10 storage=DDS-4 +sql +@# print the JobMedia records +select * from JobMedia; + +restore bootstrap=${cwd}/tmp/kern.bsr where=${cwd}/tmp/bacula-restores storage=DDS-4 +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# Now setup a control directory of only what we *should* restore +rm -rf ${cwd}/tmp/build +mkdir ${cwd}/tmp/build +for i in ${files}; do + cp -p ${cwd}/build/src/dird/${i} ${cwd}/tmp/build +done + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/tests/restore2-by-file-test b/regress/tests/restore2-by-file-test new file mode 100755 index 0000000000..1a4553ab14 --- /dev/null +++ b/regress/tests/restore2-by-file-test @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then restore a few selected files. +# +TestName="restore2-by-file-test" +JobName=restore2byfile +. scripts/functions +copy_test_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list +sed s%\^%${cwd}% ${cwd}/scripts/flist | sort | uniq >${cwd}/tmp/restore2-list + +change_jobname CompressedTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File file=<${cwd}/tmp/restore2-list +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +dstat=0 +for i in `cat ${cwd}/tmp/restore2-list`; do + diff $i ${cwd}/tmp/bacula-restores$i + if [ $? != 0 ] ; then + dstat=1 + fi +done +end_test diff --git a/regress/tests/runscript-test b/regress/tests/runscript-test new file mode 100755 index 0000000000..2dceb5d36d --- /dev/null +++ b/regress/tests/runscript-test @@ -0,0 +1,145 @@ +#!/bin/sh +# +# Test RunScript +# + +TestName="runscript-test" +JobName=backup + +. scripts/functions +copy_test_confs + +rm -f bin/bacula-dir.conf +rm -f ${cwd}/tmp/RUN*log +rm -f ${cwd}/tmp/RUN_FD_FAILED + +touch ${cwd}/tmp/log1.out +/bin/cp -f scripts/bacula-dir.conf.testrunscript bin/bacula-dir.conf + +echo "${cwd}/build/po" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +label volume=TestVolume001 +@$out ${cwd}/tmp/RUN_FD_WARNING.log +run job=RUN_FD_WARNING yes +wait +messages +@sleep 1 +@$out ${cwd}/tmp/RUN_ALL_OK.log +run job=RUN_ALL_OK yes +wait +messages +@sleep 1 +@$out ${cwd}/tmp/RUN_FD_FAILED.log +run job=RUN_FD_FAILED yes +wait +messages +@sleep 1 +@$out ${cwd}/tmp/RUN_DIR_FAILED.log +run job=RUN_DIR_FAILED yes +wait +messages +@sleep 1 +@$out ${cwd}/tmp/RUN_FD_FAILED2.log +run job=RUN_FD_FAILED2 yes +wait +messages +st dir +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +dstat=0 +bstat=0 +rstat=0 +export dstat +export bstat +export rstat + +grep 'dir: BeforeJob: run command "/bin/echo RunBeforeJob"' ${cwd}/tmp/RUN_ALL_OK.log >/dev/null 2>&1 +a=$? +grep 'fd: ClientRunBeforeJob: ClientRunBeforeJob' ${cwd}/tmp/RUN_ALL_OK.log >/dev/null 2>&1 +b=$? +grep 'fd: ClientAfterJob: run command "/bin/echo ClientRunAfterJob' ${cwd}/tmp/RUN_ALL_OK.log >/dev/null 2>&1 +c=$? +grep 'dir: AfterJob: run command "/bin/echo RunAfterJob' ${cwd}/tmp/RUN_ALL_OK.log >/dev/null 2>&1 +d=$? +if [ $a = 0 -a $b = 0 -a $c = 0 -a $d = 0 ] +then + [ "$debug" = 1 ] && echo RUN_ALL_OK ok +else + echo "RUN_ALL_OK in error" + rstat=1 +fi + +grep 'dir: BeforeJob: run command "/bin/false RUN_DIR_FAILED"' ${cwd}/tmp/RUN_DIR_FAILED.log >/dev/null 2>&1 +a=$? +grep 'dir: AfterJob: RunAfterFailedJob' ${cwd}/tmp/RUN_DIR_FAILED.log >/dev/null 2>&1 +b=$? +if [ $a = 0 -a $b = 0 ] +then + [ "$debug" = 1 ] && echo RUN_DIR_FAILED ok +else + echo "RUN_DIR_FAILED in error" + rstat=1 +fi + +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +a=$? +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED2"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +b=$? +grep 'dir: AfterJob: run command "/bin/echo RunAfterFailedJob"' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +c=$? +#grep 'touching' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +test -f ${cwd}/tmp/RUN_FD_FAILED +d=$? +grep '*** Backup Error ***' ${cwd}/tmp/RUN_FD_FAILED.log >/dev/null 2>&1 +e=$? +if [ $a = 0 -a $b = 0 -a $c = 0 -a $d = 0 -a $e = 0 ] +then + [ "$debug" = 1 ] && echo RUN_FD_FAILED ok +else + echo "RUN_FD_FAILED in error" + rstat=1 +fi + +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1"' ${cwd}/tmp/RUN_FD_FAILED2.log >/dev/null 2>&1 +a=$? +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED2"' ${cwd}/tmp/RUN_FD_FAILED2.log >/dev/null 2>&1 +b=$? +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED3"' ${cwd}/tmp/RUN_FD_FAILED2.log >/dev/null 2>&1 +c=$? +grep 'dir: AfterJob: run command "/bin/echo RunAfterFailedJob"' ${cwd}/tmp/RUN_FD_FAILED2.log >/dev/null 2>&1 +d=$? +grep '*** Backup Error ***' ${cwd}/tmp/RUN_FD_FAILED2.log >/dev/null 2>&1 +e=$? +if [ $a = 0 -a $b != 0 -a $c = 0 -a $d = 0 -a $e = 0 ] +then + [ "$debug" = 1 ] && echo RUN_FD_FAILED ok +else + echo "RUN_FD_FAILED2 in error" + rstat=1 +fi + +grep 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_WARNING"' ${cwd}/tmp/RUN_FD_WARNING.log >/dev/null 2>&1 +a=$? +grep 'RunAfterFailedJob' ${cwd}/tmp/RUN_FD_WARNING.log >/dev/null 2>&1 +b=$? +grep 'Backup OK -- with warnings' ${cwd}/tmp/RUN_FD_WARNING.log >/dev/null 2>&1 +c=$? +if [ $a = 0 -a $b != 0 -a $c = 0 ] +then + [ "$debug" = 1 ] && echo RUN_FD_WARNING ok +else + echo "RUN_FD_WARNING in error" + rstat=1 +fi + +end_test diff --git a/regress/tests/scratch-pool-test b/regress/tests/scratch-pool-test new file mode 100755 index 0000000000..47a8cb96e8 --- /dev/null +++ b/regress/tests/scratch-pool-test @@ -0,0 +1,72 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to two tapes where the maximum tape file size is set to 1M +# Note, this test simulates the tape filling and writing to +# the next tape. One minor wrinkle: we create the two tapes +# in the Scratch pool, so they should be switched to the Default +# Pool automatically. +# We set TestVolume001 to not in the changer, so the algorithm +# should find TestVolume002 and use it rather than blocking. +# +# Note we use the viritual disk autochanger +# +TestName="scratch-pool-test" +JobName=scratch-pool +. scripts/functions + +if test x${AUTOCHANGER} = x/dev/null ; then + echo "two-volume-test skipped. No autochanger." + exit +fi +cwd=`pwd` +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks + +echo "${cwd}/build" >${cwd}/tmp/file-list + +outf="${cwd}/tmp/sed_tmp" +echo "s%# Maximum File Size% Maximum File Size%g" >${outf} +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Scratch drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Scratch drive=0 +update Volume=TestVolume001 MaxVolBytes=2000000 pool=Scratch drive=0 +update Volume=TestVolume001 inchanger=no pool=Scratch drive=0 +@#setdebug level=200 storage=DDS-4 +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=$JobName yes +wait +messages +list volumes +llist volume=TestVolume001 +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/six-vol-test b/regress/tests/six-vol-test new file mode 100755 index 0000000000..9b4571fee1 --- /dev/null +++ b/regress/tests/six-vol-test @@ -0,0 +1,69 @@ +#!/bin/sh +# +# Create a 60MB file with random bytes. Back it up to 6 Volumes +# each constrained to 10MB using the automatic labeling feature. +# +TestName="six-vol-test" +JobName=SixVol +. scripts/functions + +if test ! -c /dev/urandom ; then + echo "No random device. Test skipped.\n" + exit 0 +fi + +scripts/cleanup +scripts/copy-testa-confs +# copy special conf file +/bin/cp -f scripts/testb-bacula-dir.conf bin/bacula-dir.conf + +echo "${cwd}/tmp/largefile" >${cwd}/tmp/file-list +# Create 56MB file with random data +echo "Creating a 56MB file with random data ..." +dd if=/dev/urandom of=${cwd}/tmp/largefile bs=1024 count=55000 +echo "largefile created" + +change_jobname MultiVol $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=50 storage=File +run job=$JobName storage=File yes +run job=$JobName storage=File yes +run job=$JobName storage=File yes +run job=$JobName storage=File yes +run job=$JobName storage=File yes +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +sql +select * from JobMedia where JobId=4; +select * from JobMedia where JobId=5; + +@#setdebug level=50 storage=File +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +diff ${cwd}/tmp/largefile ${cwd}/tmp/bacula-restores${cwd}/tmp/largefile 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/tests/small-file-size-tape b/regress/tests/small-file-size-tape new file mode 100755 index 0000000000..d6e8163a9a --- /dev/null +++ b/regress/tests/small-file-size-tape @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where the maximum tape file size is set to 1M +# +TestName="small-file-size-tape" +JobName=smallfilesize +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +setdebug level=2 storage=DDS-4 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/span-vol-test b/regress/tests/span-vol-test new file mode 100755 index 0000000000..d687c7d526 --- /dev/null +++ b/regress/tests/span-vol-test @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# split the archive into four volumes, two of which are +# totally full. I.e. make sure that bsr selects all tapes +# including those fully spanned. +# +TestName="span-vol-test" +JobName=SpanVol +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File1 volume=TestVolume004 +label storage=File1 volume=TestVolume003 +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume001 +update Volume=TestVolume004 MaxVolBytes=3000000 +update Volume=TestVolume003 MaxVolBytes=3000000 +update Volume=TestVolume002 MaxVolBytes=3000000 +run job=$JobName storage=File1 yes +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/sparse-compressed-test b/regress/tests/sparse-compressed-test new file mode 100755 index 0000000000..47e05e41c1 --- /dev/null +++ b/regress/tests/sparse-compressed-test @@ -0,0 +1,43 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the Sparse option +# then restore it. +# +TestName="sparse-compressed-test" +JobName=Sparse-conpressed +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +cat >${cwd}/tmp/bconcmds <${cwd}/tmp/file-list +cd ${cwd}/build/src/tools +./gigaslam +if [ $? != 0 ]; then + echo "Execute of ${cwd}/build/src/tools/gigaslam failed." + rm -f ${cwd}/build/src/tools/gigaslam.gif + exit 1 +fi +cd ${cwd} + +change_jobname SparseTest $JobName +start_test + +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@$out ${cwd}/tmp/log1.out +label storage=File volume=TestVolume001 +setdebug level=10 fd +run job=$JobName yes +wait +messages +list volumes +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +@# setdebug level=0 fd +restore where=${cwd}/tmp/bacula-restores storage=File +5 +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +if [ ! -f ${cwd}/tmp/bacula-restores/${cwd}/build/src/tools/gigaslam.gif ]; then + echo "============= file gigaslam.gif was not restored =======" + size=0 +else + size=`du ${cwd}/tmp/bacula-restores/${cwd}/build/src/tools/gigaslam.gif | cut -f 1` + if [ $size -gt 120 ]; then + echo "========== restored sparse file: gigaslam.gif too big =========" + echo " size is ${size}K it should be 120K" + fi +fi + +check_two_logs +check_restore_diff +end_test +rm -f ${cwd}/build/src/tools/gigaslam.gif +rm -f ${cwd}/build/gigaslam.gif diff --git a/regress/tests/sparse-test b/regress/tests/sparse-test new file mode 100755 index 0000000000..38d12fd998 --- /dev/null +++ b/regress/tests/sparse-test @@ -0,0 +1,45 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the Sparse option +# then restore it. +# +TestName="sparse-test" +JobName=SparseTest +. scripts/functions + +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +cat >${cwd}/tmp/bconcmds <test.out +rm -f bin/working/* diff --git a/regress/tests/three-pool-recycle-test b/regress/tests/three-pool-recycle-test new file mode 100755 index 0000000000..57790ce9e6 --- /dev/null +++ b/regress/tests/three-pool-recycle-test @@ -0,0 +1,106 @@ +#!/bin/sh +# +# This is Arno's test. It uses three pools, three tapes, and +# an autochanger. Note, the Director has four Pools in its +# conf: Default, Full, Inc, and Scratch. Default is used in the +# NightlySave job by default. What is backed up is what +# is in ${cwd}/tmp/file-list, which is by default the Bacula +# source code (i.e. the build directory). +# +# Note, we use the virtual disk autochanger. +# +TestName="three-pool-recycle-test" +JobName=Three-pool-recycle +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks + +# remove Client Run Before Job +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +sed "s%Client Run Before Job%#Client Run Before Job%" ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +# Write out bconsole commands to a file +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=150 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +label storage=DDS-4 volume=TestVolume003 slot=3 pool=Scratch drive=0 +update Volume=TestVolume001 maxvoljobs=1 +update Volume=TestVolume002 maxvoljobs=1 +update Volume=TestVolume003 volretention=7s +update Volume=TestVolume003 maxvoljobs=1 +list volumes +llist volume=TestVolume003 +@# should pull Scratch volume +run job=NightlySave1 level=Full pool=Inc yes +wait +update Volume=TestVolume003 volretention=7s +update Volume=TestVolume003 maxvoljobs=1 +messages +list volumes +llist volume=TestVolume003 +run job=NightlySave1 level=Full pool=Default yes +wait +messages +list volumes +llist volume=TestVolume003 +run job=NightlySave1 level=Full pool=Full yes +wait +@sleep 10 +messages +list volumes +llist volume=TestVolume003 +@# should recycle Scratch pool +run job=NightlySave2 level=Full pool=Inc yes +wait +update Volume=TestVolume003 volretention=7s +update Volume=TestVolume003 maxvoljobs=1 +@sleep 10 +messages +list volumes +@# should recycle Scratch pool +llist volume=TestVolume003 +@#setdebug level=50 dir +run job=NightlySave2 level=Full pool=Default yes +wait +update Volume=TestVolume003 volretention=7s +update Volume=TestVolume003 maxvoljobs=1 +@sleep 10 +messages +list volumes +@# should recycle Scratch pool +run job=NightlySave2 level=Full pool=Full yes +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/three-pool-test b/regress/tests/three-pool-test new file mode 100755 index 0000000000..92ff97f656 --- /dev/null +++ b/regress/tests/three-pool-test @@ -0,0 +1,83 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory. Create three +# tapes, each in a different pool, then run two jobs both of which +# want the tape that is not loaded. Note, they both have +# prefers non-mounted tapes. This should expose bug #801 +# +# This script uses the virtual disk autochanger and two drives +# +TestName="three-pool-disk" +JobName="threepooldisk" +. scripts/functions + +scripts/cleanup +scripts/copy-2disk-drive-confs +scripts/prepare-two-disks + +echo "${cwd}/build" >${cwd}/tmp/file-list +change_jobname NightlySave $JobName +start_test + +# Turn off Prefer Mounted Volumes so we use 2 drives +outf="${cwd}/tmp/sed_tmp" +echo "s%# Prefer Mounted Volumes% Prefer Mounted Volumes%g" >${outf} +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +# Comment the next line out to write everything to one drive +# otherwise, it writes the two jobs to different drives +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +# Write out bconsole commands +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +@$out ${cwd}/tmp/log1.out +@#setdebug level=200 storage=DDS-4 +@#setdebug level=200 client +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Full drive=0 +label storage=DDS-4 volume=TestVolume003 slot=3 Pool=Inc drive=1 +status storage=DDS-4 +run job=$JobName level=Full Pool=Default yes +run job=$JobName level=Full Pool=Default yes +run job=$JobName level=Full Pool=Default yes +run job=$JobName level=Full Pool=Default yes +run job=$JobName level=Full Pool=Default yes +@sleep 10 +status storage=DDS-4 +list volumes +wait +list volumes +list jobs +status storage=DDS-4 +messages +quit +END_OF_DATA + +# exit + +run_bacula +cat <${cwd}/tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out ${cwd}/tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff + +end_test diff --git a/regress/tests/tls-test b/regress/tests/tls-test new file mode 100755 index 0000000000..8e8899408e --- /dev/null +++ b/regress/tests/tls-test @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory with TLS +# communications code enabled then restore it. +# +TestName="tls-test" +JobName=tls +. scripts/functions + +scripts/cleanup +scripts/copy-tls-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname CompressedTest $JobName +start_test + +cat <tmp/bconcmds +@output +messages +@$out tmp/log1.out +status all +status all +messages +label storage=File volume=TestVolume001 pool=Default +run job=$JobName storage=File yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/truncate-bug-tape b/regress/tests/truncate-bug-tape new file mode 100755 index 0000000000..98c0b8387e --- /dev/null +++ b/regress/tests/truncate-bug-tape @@ -0,0 +1,86 @@ +#!/bin/sh +# +# Test for a tape truncation bug. +# +TestName="truncate-bug-tape" +JobName=truncatebug +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +@# do a bunch of saves so we have 12 files on the tape +run job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +@#setdebug level=100 storage=DDS-4 +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 +3 +@# select JobId=4 (i.e. file five on the tape) +4 +cd ${cwd}/build +@# mark a single file +mark configure +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +scripts/check_for_zombie_jobs storage=DDS-4 + +# Now write to tape one more time +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log3.out +run level=Full job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +grep "^ Termination: *Backup OK" tmp/log3.out 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/tests/two-jobs-test b/regress/tests/two-jobs-test new file mode 100755 index 0000000000..4f1fdabdcd --- /dev/null +++ b/regress/tests/two-jobs-test @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup a second time and finally restore it +# +TestName="two-jobs-test" +JobName=Two-Jobs +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname CompressedTest $JobName +start_test + +cat >tmp/bconcmds <tmp/bconcmds <${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list + +start_test + +# Write out bconsole commands to a file +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +list volumes +@# Start job with Client run before and sleep +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +@# wait between starting jobs +@sleep 60 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +@sleep 10 +messages +@sleep 10 +messages +@sleep 10 +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/two-pool-test b/regress/tests/two-pool-test new file mode 100755 index 0000000000..e6d729acc6 --- /dev/null +++ b/regress/tests/two-pool-test @@ -0,0 +1,77 @@ +#!/bin/sh +# +# This is Arno's test. It uses two pools, two tapes, and +# an autochanger. Note, the Director has three Pools in its +# conf: Default, Full, and Inc. Default is used in the +# NightlySave job by default. What is backed up is what +# is in ${cwd}/tmp/file-list, which is by default the Bacula +# source code (i.e. the build directory). +# +# Note, we use the virtual disk autochanger. +# +TestName="two-pool-test" +JobName=Two-pool +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks + +# Make a relatively large backup set 5 x source code directory +# Reduced to 1 for portable +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +# Write out bconsole commands to a file +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +@#setdebug level=150 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +list volumes +@# Start job with Client run before and sleep +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +@# wait between starting jobs +@sleep 30 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +@sleep 10 +messages +@sleep 10 +messages +@sleep 10 +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/two-vol-test b/regress/tests/two-vol-test new file mode 100755 index 0000000000..15f48ee5b2 --- /dev/null +++ b/regress/tests/two-vol-test @@ -0,0 +1,46 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory but +# split the archive into two volumes +# +TestName="two-vol-test" +JobName=TwoVol +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume001 +update Volume=TestVolume002 MaxVolBytes=3000000 +run job=$JobName storage=File1 yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=File1 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File1 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/two-volume-tape b/regress/tests/two-volume-tape new file mode 100755 index 0000000000..e6c5312e24 --- /dev/null +++ b/regress/tests/two-volume-tape @@ -0,0 +1,84 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to two tapes where the maximum tape file size is set to 1M +# Note, this test simulates the tape filling and writing to +# the next tape. +# +TestName="two-volume-tape" +JobName=twovoltape +. scripts/functions + +if test x${AUTOCHANGER} = x/dev/null ; then + echo "two-volume-tape test skipped. No autochanger." + exit +fi + +scripts/cleanup +scripts/copy-2tape-confs +scripts/prepare-two-tapes + +echo "${cwd}/build" >${cwd}/tmp/file-list + +outf="tmp/sed_tmp" +echo "s%# Maximum File Size% Maximum File Size%g" >${outf} +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname $JobName +start_test + +# Write out bconsole commands +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0 +sql +select * from Storage; +select VolumeName,InChanger,Slot,StorageId from Media; + +@#setdebug level=1000 client +@#setdebug level=250 storage=DDS-4 +run job=$JobName yes +wait +sql +select * from Storage; +select VolumeName,InChanger,Slot,StorageId from Media; + +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +mt -f ${TAPE_DRIVE} rewind +mtx -f ${AUTOCHANGER} unload +sleep 15 + +cat <tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/two-volume-test b/regress/tests/two-volume-test new file mode 100755 index 0000000000..1266e75d76 --- /dev/null +++ b/regress/tests/two-volume-test @@ -0,0 +1,68 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to two tapes where the maximum tape file size is set to 1M +# Note, this test simulates the tape filling and writing to +# the next tape. +# +# Note we use the viritual disk autochanger +# +TestName="two-volume-test" +JobName=TwoVolume +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-2disk-confs +scripts/prepare-two-disks + +echo "${cwd}/build" >${cwd}/tmp/file-list + +outf="tmp/sed_tmp" +echo "s%# Maximum File Size% Maximum File Size%g" >${outf} +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +# Write out bconsole commands +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0 +sql +select * from Storage; +select VolumeName,InChanger,StorageId from Media; + +@#setdebug level=1000 client +run job=$JobName yes +wait +update slots scan storage=DDS-4 +sql +select * from Storage; +select VolumeName,InChanger,StorageId from Media; + +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/tests/usr-tape-root b/regress/tests/usr-tape-root new file mode 100755 index 0000000000..dbc0ed9daf --- /dev/null +++ b/regress/tests/usr-tape-root @@ -0,0 +1,63 @@ +#!/bin/sh +# +# Run a simple backup of the /usr directory +# then restore it. +# +cwd=`pwd` +. scripts/functions +scripts/copy-tape-confs +scripts/cleanup-tape +echo "/usr" >${cwd}/tmp/file-list + +echo " " +echo " " +echo " === Starting usr-tape-root test ===" +echo " " +echo " " + +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/nul +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! usr-tape-root failed !!!! ===== " + echo " ===== !!!! usr-tape-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== usr-tape-root OK ===== " + echo " ===== usr-tape-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/tests/verify-cat-test b/regress/tests/verify-cat-test new file mode 100755 index 0000000000..909dfedc32 --- /dev/null +++ b/regress/tests/verify-cat-test @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple Verify InitCatalog, then Verify Catalog +# +TestName="verify-cat-test" +JobName=VerifyCatalog +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list +#echo "${cwd}/do_all" >${cwd}/tmp/file-list +#echo "${cwd}/do_all_tapes" >>${cwd}/tmp/file-list +#echo "${cwd}/do_file" >>${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=VerifyVolume level=InitCatalog yes +wait +messages +@# +@# now do a verify Catalog +@# +@$out ${cwd}/tmp/original +run job=VerifyVolume level=Catalog yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula + +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +grep "^ Termination: *Verify OK" tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Verify OK" ${cwd}/tmp/original 2>&1 >/dev/null +rstat=$? +dstat=0 +end_test diff --git a/regress/tests/verify-vol-tape b/regress/tests/verify-vol-tape new file mode 100755 index 0000000000..9927adee7b --- /dev/null +++ b/regress/tests/verify-vol-tape @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then verify the catalog. +# +TestName="verify-vol-tape" +JobName=VerifyVol +. scripts/functions + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +setdebug level=1 storage=DDS-4 sd +label storage=DDS-4 volume=TestVolume001 pool=Default +run job=$JobName yes +wait +messages +@# +@# now do a verify volume +@# +@$out ${cwd}/tmp/original +run job=VerifyTape pool=Default +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula + +sleep 2 +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +grep "^ Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Verify OK" ${cwd}/tmp/original 2>&1 >/dev/null +rstat=$? +dstat=0 +end_test diff --git a/regress/tests/verify-vol-test b/regress/tests/verify-vol-test new file mode 100755 index 0000000000..88e875ac66 --- /dev/null +++ b/regress/tests/verify-vol-test @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then verify the catalog. +# +TestName="verify-vol-test" +JobName=VerifyVol +. scripts/functions + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +setdebug level=1 storage=File sd +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@# +@# now do a verify volume +@# +@$out ${cwd}/tmp/original +setdebug level=12 dir +run job=VerifyVolume +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula + +sleep 2 +check_for_zombie_jobs storage=File +stop_bacula + +grep "^ Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Verify OK" ${cwd}/tmp/original 2>&1 >/dev/null +rstat=$? +dstat=0 +end_test diff --git a/regress/tests/weird-files-test b/regress/tests/weird-files-test new file mode 100755 index 0000000000..1c1c34d294 --- /dev/null +++ b/regress/tests/weird-files-test @@ -0,0 +1,79 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="weird-files-test" +JobName=wierd-files +. scripts/functions + +if test ! -d weird-files ; then + echo " " + echo "Weird files not configured. Test not run." + exit 0 +fi + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +change_jobname NightlySave $JobName +# +# Note, we save the weird-files directory twice on purpose +# because this causes problems with hard linked files +# that are only saved once. In 1.33, Bacula now deals +# with this situation. +# +echo "${cwd}/weird-files" >${cwd}/tmp/file-list +echo "${cwd}/weird-files" >>${cwd}/tmp/file-list + +# Create a Unix domain socket (sock-file) +cd weird-files +perl socket.pl +cd .. + +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File +TestVolume001 +run job=$JobName +yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula +# Note, the Unix domain socket (sock-file) is not restored +# by Bacula so we delete it for the diffs +rm -f weird-files/sock-file +touch weird-files tmp/bacula-restores${cwd}/weird-files + +${cwd}/bin/testls weird-files | sort >${cwd}/tmp/original +cd tmp/bacula-restores${cwd} +${cwd}/bin/testls weird-files | sort >${cwd}/tmp/restored +cd ${cwd} + +check_two_logs +#diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null +diff ${cwd}/tmp/original ${cwd}/tmp/restored + +dstat=$? +end_test diff --git a/regress/tests/weird-files2-test b/regress/tests/weird-files2-test new file mode 100755 index 0000000000..ae3aad6954 --- /dev/null +++ b/regress/tests/weird-files2-test @@ -0,0 +1,83 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="weird-files2-test" +JobName=weird-files2 +. scripts/functions + +if test ! -d weird-files ; then + echo " " + echo "weird files not configured. Test not run." + exit 0 +fi +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +rm -rf weird-files2 +cp -Rp weird-files weird-files2 +echo "${cwd}/weird-files2" >${cwd}/tmp/file-list +cd weird-files2 +perl socket.pl +cd .. + +change_jobname NightlySave $JobName +start_test + +bin/testls weird-files2 | grep -v sock-file >${cwd}/tmp/original + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +# +# Now mess up the a hard link, and a soft link +# +cd weird-files2 +rm -f hard-file2 +ln hard-file3 hard-file2 +rm -f soft-file2 +ln -s soft-file3 soft-file2 +cd ${cwd} +cat <tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where= storage=File +5 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File +stop_bacula + +bin/testls weird-files2 >${cwd}/tmp/restored + +check_two_logs +#diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null +diff ${cwd}/tmp/original ${cwd}/tmp/restored +dstat=$? + +end_test diff --git a/regress/tests/win32-backup-tape b/regress/tests/win32-backup-tape new file mode 100755 index 0000000000..299fdd4873 --- /dev/null +++ b/regress/tests/win32-backup-tape @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="win32-backup-tape" +JobName=win32tape +. scripts/functions + +scripts/copy-win32-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0 +run job=$JobName yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# no diff for now +dstat=0 +end_test diff --git a/regress/tests/win32-to-linux-tape b/regress/tests/win32-to-linux-tape new file mode 100755 index 0000000000..05abd85716 --- /dev/null +++ b/regress/tests/win32-to-linux-tape @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="win32-to-linux-tape" +JobName=AutoLabel +. scripts/functions + +scripts/copy-win32-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_job $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0 +run job=NightlySave yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores client=Tibs select all storage=DDS-4 done +yes +wait +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# No diff for the moment +dstat=0 +end_test diff --git a/regress/weird-files.tar.gz b/regress/weird-files.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..09d1ebd486fdf534076682651a40270ed8c1cd51 GIT binary patch literal 1957 zcmZY7dpy&70|)Rq6)PECbXiFWEMx+x|v6s97xzBUd3PI-9=rYTYca2 zF8M>1`rP#dagpl3E?QD!pBsef!#X=lxPwM@De+0NG_IN9u)_73p0M2imi z7%Nw1`Chyxisb0#-D_hx?CakRhm$=+Vjn0EVWtDs=0wR2=6$*$G2iD9=9UX4)q}AZ zJElv+N$O7`*1GkBhyt&^L3&JGmd6)%PQ{!cB#$@aaJ2X$a1MzN^*+N~Y1yx=4xz}) zwKr(%J?*P7v%YQ@{>U$s*DlORW(wUBgN$?E8tzQ5f9Z>H(LL0XU$Qc%yBsf*Bb(Jn zUPYtu?w0>J2UszujR(jlR*d}FF)i;8aXQEkqI~38Bz`2ZW#u^Y!n5}{S1K!>A(>Nu zX4n}<^@8AQfaNBnF|X|POU6VD8fr!OoxOt;vesBeqg$lZA6q z*>U|U$*h4pE;@O8X;JoH37VK#TvD6{oC)|?bipV1pmwUqAB0K>&#dQc!F8K_G%+Dg z(MDu>b`;xd$?_GiOg3T~0k)zA5UfPN;zNfP)S#cMrZqW%hWfGNRuyzSYUB7>tOOrMD9gH_g??C|dvsrKa31Q) zfr*vqw}PRH`|$o3Ko_oe)Bz?ME#sRvgplQi zJySL_V;0KyV6RUXL`=n@SbMF(T;P;Z<-GLKBZ{n*)5&( z{;fad2^rW;SL>P1dEOdLZjNbeP`ZZnUc{{-)h*%H?9z_$0_NQ2UE7cSeA{Oh&_GefG@=aX%{^` zE{1^)yacmP+NzFGkUB>@@M6qXeM-@glH8C$F4A;j8k^AKh6HF>6?}RzuD{FUO@nAg z?w_JzIJql9>6xLyLcj-`GS97j+Xx2&Jp^7fk%B;ZV+)!2O?Aqw1gG5v`cY*C_}~3- zTfpA`nLhB{bT=DCDJ~oOfOe=G+~-MtHW&606FkAa*8D02DIb;-e8R7LY^=K#Ogf9KQ5~hkKFp>%>zs1m1MNhYPe2kRJLM9&`H9nnul 2>&1 +COPY test.out test1.out +CALL tests\test0 +CALL tests\backup-bacula-tape +CALL tests\btape-fill-tape +CALL tests\fixed-block-size-tape +CALL tests\four-concurrent-jobs-tape +CALL tests\four-jobs-tape +CALL tests\incremental-tape +CALL tests\relabel-tape +CALL tests\restore-by-file-tape +CALL tests\small-file-size-tape +CALL tests\truncate-bug-tape +CALL tests\two-pool-tape +CALL tests\2drive-incremental-2tape +CALL tests\bscan-tape +CALL tests\verify-vol-tape +ECHO. +ECHO. +ECHO Test results +TYPE test.out +CALL scripts\cleanup diff --git a/regress/win32/all-non-root-tests.cmd b/regress/win32/all-non-root-tests.cmd new file mode 100644 index 0000000000..faeb4699ae --- /dev/null +++ b/regress/win32/all-non-root-tests.cmd @@ -0,0 +1,48 @@ +REM +REM Run all tests +REM +DEL test1.out +CALL tests\test0 +ECHO. +CALL tests\auto-label-test +CALL tests\backup-bacula-test +CALL tests\bextract-test +CALL tests\bscan-test +CALL tests\bsr-opt-test +CALL tests\compressed-test +CALL tests\concurrent-jobs-test +CALL tests\data-encrypt-test +CALL tests\differential-test +CALL tests\four-concurrent-jobs-test +CALL tests\four-jobs-test +CALL tests\incremental-test +CALL tests\query-test +CALL tests\recycle-test +CALL tests\restore2-by-file-test +CALL tests\restore-by-file-test +CALL tests\restore-disk-seek-test +CALL tests\six-vol-test +CALL tests\span-vol-test +CALL tests\sparse-compressed-test +CALL tests\sparse-test +CALL tests\two-jobs-test +CALL tests\two-vol-test +CALL tests\verify-vol-test +REM CALL tests\weird-files2-test +REM CALL tests\weird-files-test +CALL tests\migration-job-test +CALL tests\migration-jobspan-test +CALL tests\migration-volume-test +CALL tests\migration-time-test +REM CALL tests\hardlink-test +REM +REM The following are Virtual Disk Autochanger tests +CALL tests\two-pool-test +CALL tests\two-volume-test +CALL tests\incremental-2disk +CALL tests\2drive-incremental-2disk +CALL tests\scratch-pool-test +ECHO. +ECHO Test results +TYPE test.out +CALL scripts\cleanup diff --git a/regress/win32/all-root-tests.cmd b/regress/win32/all-root-tests.cmd new file mode 100644 index 0000000000..20061b1768 --- /dev/null +++ b/regress/win32/all-root-tests.cmd @@ -0,0 +1,10 @@ +REM +REM Run all root tests +REM +DEL test.out +CALL tests\dev-test-root +CALL tests\etc-test-root +CALL tests\lib-test-root +CALL tests\usr-tape-root +TYPE test.out +CALL scripts\cleanup diff --git a/regress/win32/all-tape-and-file-tests.cmd b/regress/win32/all-tape-and-file-tests.cmd new file mode 100644 index 0000000000..cbbebf2c2d --- /dev/null +++ b/regress/win32/all-tape-and-file-tests.cmd @@ -0,0 +1,5 @@ +REM +REM Run all tests +REM +CALL all-non-root-tests +CALL all-non-root-tape-tests diff --git a/regress/win32/all-tests.cmd b/regress/win32/all-tests.cmd new file mode 100644 index 0000000000..62ffa6e940 --- /dev/null +++ b/regress/win32/all-tests.cmd @@ -0,0 +1,7 @@ +REM +REM Run all tests +REM +CALL all-non-root-tests +CALL all-root-tests +TYPE test.out +CALL scripts\cleanup diff --git a/regress/win32/config.cmd b/regress/win32/config.cmd new file mode 100644 index 0000000000..95a4113b1d --- /dev/null +++ b/regress/win32/config.cmd @@ -0,0 +1,10 @@ +@ECHO off +REM +REM First argument is expected to be a user's configuration file +REM +IF "%1" == "" ( + ECHO Arg1 must specify a config file ^(e.g. prototype.conf^) + EXIT /b 1 +) + +COPY %1 config_var.cmd diff --git a/regress/win32/make.cmd b/regress/win32/make.cmd new file mode 100644 index 0000000000..eaf74b1a4e --- /dev/null +++ b/regress/win32/make.cmd @@ -0,0 +1,111 @@ +@ECHO off +REM +REM Makefile for Bacula regression testing +REM +REM Note, Makefile is built from Makefile.in, which you should not really +REM need to change, by invoking: +REM +REM config +REM +REM e.g. +REM config kern.conf +REM + +SETLOCAL + +IF EXIST config_var.cmd GOTO :already_configured +ECHO You must run config first and supply the name of your conf file. +ECHO Use prototype.conf as a template. +EXIT /B 1 + +:already_configured + +SET PATH=%PATH%;%CD%\bin;%CD%\tools + +REM suck in user's configuration +CALL config_var.cmd + +IF EXIST "%BACULA_SOURCE%\configure" GOTO :source_ok +ECHO Unable to access the Bacula source in %BACULA_SOURCE%. Update +ECHO BACULA_SOURCE in your configuration file and rerun config. +EXIT /B 1 + +:source_ok +IF "%1" == "setup" GOTO :setup +IF "%1" == "bacula" GOTO :bacula +IF "%1" == "sed" GOTO :sed +IF "%1" == "test" GOTO :test +IF "%1" == "full_test" GOTO :full_test +IF "%1" == "root_test" GOTO :root_test +IF "%1" == "clean" GOTO :clean +IF "%1" == "reset" GOTO :reset +IF "%1" == "distclean" GOTO :distclean + +IF EXIST "%1" ( + %1 +) ELSE IF EXIST "%1.cmd" ( + %1 +) ELSE IF EXIST tests\%1 ( + tests\%1 +) ELSE IF EXIST tests\%1.cmd ( + tests\%1 +) ELSE ( + ECHO Unsupported option: %1 + ECHO Valid options are: + ECHO setup, bacula, sed, test, full_test, root_test, clean, reset, distclean + EXIT /b 1 +) + +:setup +CALL :bacula %2 +CALL :sed +GOTO :EOF + +:bacula +RD /s /q build bin weird-files tmp working 2>nul +MKDIR tmp working +SET BUILD_TYPE=%1 +IF "%BUILD_TYPE%"=="" SET BUILD_TYPE=release +ECHO Doing: scripts\setup "%BACULA_SOURCE%" %BUILD_TYPE% %EMAIL% %SMTP_HOST% %TAPE_DRIVE% %AUTOCHANGER% %AUTOCHANGER_PATH% %TAPE_DRIVE1% +CALL scripts\setup "%BACULA_SOURCE%" %BUILD_TYPE% %EMAIL% %SMTP_HOST% %TAPE_DRIVE% %AUTOCHANGER% %AUTOCHANGER_PATH% %TAPE_DRIVE1% +GOTO :EOF + +:sed +ECHO Doing: scripts\do_sed %EMAIL% %SMTP_HOST% %TAPE_DRIVE% %AUTOCHANGER% %AUTOCHANGER_PATH% %TAPE_DRIVE1% +CALL scripts\do_sed %EMAIL% %SMTP_HOST% %TAPE_DRIVE% %AUTOCHANGER% %AUTOCHANGER_PATH% %TAPE_DRIVE1% +GOTO :EOF + +:test +REM Run all non-root userid tests +CALL all-non-root-tests +GOTO :EOF + +:full_test +REM run all file and tape tests +CALL all-tape-and-file-tests +GOTO :EOF + +:root_test +REM These tests require you to run as root +CALL all-root-tests +GOTO :EOF + +:clean +CALL scripts\cleanup +DEL \tmp\file-list tmp\* working\* test.out diff >nul 2>&1 +DEL 1 2 3 scripts\1 scripts\2 scripts\3 tests\1 tests\2 tests\3 >nul 2>&1 +DEL .#* /s >nul 2>&1 +GOTO :EOF + +:reset +REM Reset our userid after running as root +CALL scripts\cleanup +DEL \tmp\file-list tmp\file-list +DEL tmp\* working\* +GOTO :EOF + +:distclean +RD /s /q bin build weird-files weird-files weird-files2 tmp working 2>nul +DEL scripts\*.conf +CALL :clean +GOTO :EOF diff --git a/regress/win32/prototype.conf b/regress/win32/prototype.conf new file mode 100644 index 0000000000..e6658feeda --- /dev/null +++ b/regress/win32/prototype.conf @@ -0,0 +1,31 @@ +REM +REM Prototype personal configuration file for the regression +REM scripts. Either edit this file directly, or better copy +REM it elsewhere so it won't get overwritten. +REM + +REM +REM Put the full path to the Bacula source code to be tested +REM +SET BACULA_SOURCE= + +REM Where to send email messages +REM +SET EMAIL= +SET SMTP_HOST=localhost + +REM +REM The device name of your tape drive if you have one +REM +SET TAPE_DRIVE=tape0 +SET TAPE_DRIVE1=nul + +REM +REM if you don't have an autochanger set AUTOCHANGER to nul +REM +SET AUTOCHANGER=changer0 + +REM +REM This must be the path to the autochanger including its name +REM +SET AUTOCHANGER_PATH=%CD%\bin\mtx diff --git a/regress/win32/scripts/bacula-dir-migration.conf.in b/regress/win32/scripts/bacula-dir-migration.conf.in new file mode 100644 index 0000000000..312feb5205 --- /dev/null +++ b/regress/win32/scripts/bacula-dir-migration.conf.in @@ -0,0 +1,229 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRport = 8101 # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in /tmp +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData = yes +# Prefer Mounted Volumes = no +} + +Job { + Name = "migrate-job" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = Job + Selection Pattern = ".*Save" +} + +Job { + Name = "migrate-volume" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratevol.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = Volume + Selection Pattern = "File*" +} + +Job { + Name = "migrate-occupancy" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = PoolOccupancy +} + +Job { + Name = "migrate-time" + Type = Migrate + Level = Full + Client=@hostname@-fd + FileSet="Full Set" + Messages = Standard + Storage = DiskChanger + Write Bootstrap = "@working_dir@/migratejob.bsr" + Pool = Default + Maximum Concurrent Jobs = 4 + Selection Type = PoolTime +} + + + + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = /tmp/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = tmp\bconcmds +CALL scripts\functions run_bconsole +grep "No Jobs running." tmp\dir.out >nul 2>&1 +IF %ERRORLEVEL% NEQ 0 ( + ECHO. + ECHO !!!! Zombie Jobs in Director !!!! + ECHO !!!! Zombie Jobs in Director !!!! >>test.out + ECHO. +) +grep "No Jobs running." tmp\fd.out >nul 2>&1 +IF %ERRORLEVEL% NEQ 0 ( + ECHO. + ECHO !!!! Zombie Jobs in File daemon !!!! + ECHO !!!! Zombie Jobs in File daemon !!!! >>test.out + ECHO. +) +grep "No Jobs running." tmp\sd.out >nul 2>&1 +IF %ERRORLEVEL% NEQ 0 ( + ECHO. + ECHO !!!! Zombie Jobs in Storage daemon !!!! + ECHO !!!! Zombie Jobs in Storage daemon !!!! >>test.out + ECHO. +) +grep "ERROR" tmp/log*.out >nul 2>&1 +IF %ERRORLEVEL% EQU 0 ( + ECHO. + ECHO !!!! ERROR in log output !!!! + ECHO !!!! ERROR in log output !!!! >>test.out + ECHO. +) +grep "Fatal Error" tmp\log*.out >nul 2>&1 +IF %ERRORLEVEL% EQU 0 ( + ECHO. + ECHO !!!! Fatal Error in log output !!!! + ECHO !!!! Fatal Error in log output !!!! >>test.out + ECHO. +) diff --git a/regress/win32/scripts/cleanup-2drive.cmd.in b/regress/win32/scripts/cleanup-2drive.cmd.in new file mode 100644 index 0000000000..c49d6dbacc --- /dev/null +++ b/regress/win32/scripts/cleanup-2drive.cmd.in @@ -0,0 +1,43 @@ +REM +REM Cleanup left over files -- both before and after test run +REM +CALL scripts\cleanup + +IF NOT "@autochanger@" == "nul" ( + SET slot=0 + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1' ) DO SET slot=%%i + ECHO Slot %slot% in drive 1 + IF !slot! NEQ 0 ( + ECHO unload slot !slot! in drive 1 + bin\mtx-changer @autochanger@ unload !slot! @tape_drive1@ 1 + ) + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 @tape_drive@ 0' ) DO SET slot=%%i + ECHO Slot !slot! in drive 0 + IF !slot! NEQ 0 ( + echo "unload slot !slot! in drive 0" + bin\mtx-changer @autochanger@ unload !slot! @tape_drive@ 0 + ) + + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 @tape_drive1@ 1' ) DO SET slot=%%i + IF !slot! NEQ 2 ( + ECHO load slot 2 in drive 1 + bin\mtx-changer @autochanger@ load 2 @tape_drive1@ 1 + ) + ECHO WEOF drive 1 + mt -f @tape_drive1@ rewind + mt -f @tape_drive1@ weof + ECHO unload slot 2 in drive 1 + bin\mtx-changer @autochanger@ unload 2 @tape_drive1@ 1 + + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 @tape_drive@ 0' ) DO SET slot=%%i + ECHO Slot !slot! in drive 0 + IF !slot! NEQ 1 ( + ECHO load slot 1 in drive 0 + bin\mtx-changer @autochanger@ load 1 @tape_drive@ 0 + ) + ECHO WEOF drive 0 + mt -f @tape_drive@ rewind + mt -f @tape_drive@ weof + ECHO unload slot 1 from drive 0 + bin\mtx-changer @autochanger@ unload 1 @tape_drive@ 0 +) diff --git a/regress/win32/scripts/cleanup-2tape.cmd.in b/regress/win32/scripts/cleanup-2tape.cmd.in new file mode 100644 index 0000000000..a572d7f5a5 --- /dev/null +++ b/regress/win32/scripts/cleanup-2tape.cmd.in @@ -0,0 +1,29 @@ +REM +REM Cleanup left over files -- both before and after test run +REM + +setlocal ENABLEDELAYEDEXPANSION + +CALL scripts\cleanup + +IF NOT "@autochanger@" == "nul" ( + SET slot=0 + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 dummy 0' ) DO SET slot=%%i + IF !slot! NEQ 2 ( + bin\mtx-changer @autochanger@ unload 0 @tape_drive@ 0 + bin\mtx-changer @autochanger@ load 2 @tape_drive@ 0 + ) + mt -f @tape_drive@ rewind + mt -f @tape_drive@ weof + + REM + REM If we have an autochanger always load tape in slot 1 + REM + FOR /f %%i in ( 'bin\mtx-changer @autochanger@ loaded 0 dummy 0' ) DO SET slot=%%i + IF !slot! NEQ 1 ( + bin\mtx-changer @autochanger@ unload 0 @tape_drive@ 0 + bin\mtx-changer @autochanger@ load 1 @tape_drive@ 0 + ) +) +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof diff --git a/regress/win32/scripts/cleanup-tape.cmd.in b/regress/win32/scripts/cleanup-tape.cmd.in new file mode 100644 index 0000000000..46ce41a6d5 --- /dev/null +++ b/regress/win32/scripts/cleanup-tape.cmd.in @@ -0,0 +1,7 @@ +REM +REM Cleanup left over files -- both before and after test run +REM +CALL scripts\cleanup + +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof diff --git a/regress/win32/scripts/cleanup.cmd b/regress/win32/scripts/cleanup.cmd new file mode 100644 index 0000000000..0125175548 --- /dev/null +++ b/regress/win32/scripts/cleanup.cmd @@ -0,0 +1,23 @@ +@ECHO off +REM +REM Cleanup left over files -- both before and after test run +REM + +CALL scripts\bacula stop >nul 2>&1 + +DEL /q /f \tmp\FileVolume* tmp\FileVolume* >nul 2>&1 +DEL /q /f \tmp\TestVolume001 \tmp\Small* >nul 2>&1 +RD /s /q \tmp\bacula-restores tmp\bacula-restores >nul 2>&1 +DEL /q /f tmp\original tmp\Small* tmp\TestVolume* >nul 2>&1 +DEL /q /f tmp\restored tmp\largefile tmp\bscan.bsr tmp\log*.out >nul 2>&1 +DEL /q /f \tmp\sed_tmp \tmp\file-list >nul 2>&1 +RD /s /q tmp\build >nul 2>&1 +DEL /q /f tmp\restore-list tmp\restore2-list >nul 2>&1 +DEL /q /f tmp\fd.out tmp\dir.out tmp\sd.out >nul 2>&1 +DEL /q /f working\log tmp\TEST-* >nul 2>&1 +DEL /q /f working\*.bsr >nul 2>&1 +DEL /q /f tmp\disk-changer.cmd \tmp\disk-changer.cmd >nul 2>&1 + +CALL bin\drop_bacula_tables >nul 2>&1 +CALL bin\make_bacula_tables >nul 2>&1 +CALL bin\grant_bacula_privileges >nul 2>&1 diff --git a/regress/win32/scripts/copy-2disk-confs.cmd b/regress/win32/scripts/copy-2disk-confs.cmd new file mode 100644 index 0000000000..e759a41413 --- /dev/null +++ b/regress/win32/scripts/copy-2disk-confs.cmd @@ -0,0 +1,9 @@ +REM +REM Setup for using the Virtual Disk Changer (simulates tape changer) +REM +COPY scripts\bacula-dir-tape.conf bin\bacula-dir.conf +COPY scripts\bacula-sd-2disk.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf +COPY bin\bacula-dir.conf tmp\1 +bin\sed -e "s;# Autochanger = yes; Autochanger = yes;g" tmp\1 >bin\bacula-dir.conf diff --git a/regress/win32/scripts/copy-2disk-drive-confs.cmd b/regress/win32/scripts/copy-2disk-drive-confs.cmd new file mode 100644 index 0000000000..173eec2df0 --- /dev/null +++ b/regress/win32/scripts/copy-2disk-drive-confs.cmd @@ -0,0 +1,6 @@ +COPY scripts\bacula-dir-tape.conf bin\bacula-dir.conf +COPY scripts\bacula-sd-2disk-drive.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf +COPY bin\bacula-dir.conf tmp\1 +bin\sed -e "s;# Autochanger = yes; Autochanger = yes;g" tmp\1 >bin\bacula-dir.conf diff --git a/regress/win32/scripts/copy-2drive-confs.cmd b/regress/win32/scripts/copy-2drive-confs.cmd new file mode 100644 index 0000000000..d20bf19ca9 --- /dev/null +++ b/regress/win32/scripts/copy-2drive-confs.cmd @@ -0,0 +1,10 @@ +COPY scripts\bacula-dir-tape.conf bin\bacula-dir.conf +COPY scripts\bacula-sd-2drive.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf + +COPY bin\bacula-dir.conf tmp\1 +bin\sed -e "s;# Autochanger = yes; Autochanger = yes;g" >bin\bacula-dir.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-2tape-confs.cmd b/regress/win32/scripts/copy-2tape-confs.cmd new file mode 100644 index 0000000000..3e5af7aa12 --- /dev/null +++ b/regress/win32/scripts/copy-2tape-confs.cmd @@ -0,0 +1,10 @@ +COPY scripts\bacula-dir-tape.conf bin\bacula-dir.conf +COPY scripts\bacula-sd-2tape.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf + +COPY bin\bacula-dir.conf tmp\1 +bin\sed -e "s;# Autochanger = yes; Autochanger = yes;g" tmp\1 >bin\bacula-dir.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-confs.cmd b/regress/win32/scripts/copy-confs.cmd new file mode 100644 index 0000000000..359839c6d8 --- /dev/null +++ b/regress/win32/scripts/copy-confs.cmd @@ -0,0 +1,7 @@ +COPY scripts\bacula-dir.conf bin\bacula-dir.conf +COPY scripts\bacula-sd.conf bin\bacula-sd.conf +COPY scripts\bacula-fd.conf bin\bacula-fd.conf +COPY scripts\bconsole.conf bin\bconsole.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-crypto-confs.cmd b/regress/win32/scripts/copy-crypto-confs.cmd new file mode 100644 index 0000000000..7166399d97 --- /dev/null +++ b/regress/win32/scripts/copy-crypto-confs.cmd @@ -0,0 +1,5 @@ +COPY scripts\new-test-bacula-dir.conf bin\bacula-dir.conf +COPY scripts\test-bacula-sd.conf bin\bacula-sd.conf +COPY scripts\crypto-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf +COPY scripts\cryptokeypair.pem bin\cryptokeypair.pem diff --git a/regress/win32/scripts/copy-migration-confs.cmd b/regress/win32/scripts/copy-migration-confs.cmd new file mode 100644 index 0000000000..7bf12ddbd8 --- /dev/null +++ b/regress/win32/scripts/copy-migration-confs.cmd @@ -0,0 +1,7 @@ +REM +REM Setup for migration tests +REM +COPY scripts\bacula-dir-migration.conf bin\bacula-dir.conf +COPY scripts\bacula-sd-migration.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf diff --git a/regress/win32/scripts/copy-tape-confs.cmd b/regress/win32/scripts/copy-tape-confs.cmd new file mode 100644 index 0000000000..0a7a50a811 --- /dev/null +++ b/regress/win32/scripts/copy-tape-confs.cmd @@ -0,0 +1,7 @@ +copy scripts\bacula-dir-tape.conf bin\bacula-dir.conf +copy scripts\bacula-sd-tape.conf bin\bacula-sd.conf +copy scripts\test-bacula-fd.conf bin\bacula-fd.conf +copy scripts\test-console.conf bin\bconsole.conf + +REM get proper SD tape definitions +copy scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-test-confs.cmd b/regress/win32/scripts/copy-test-confs.cmd new file mode 100644 index 0000000000..c07c5d6204 --- /dev/null +++ b/regress/win32/scripts/copy-test-confs.cmd @@ -0,0 +1,7 @@ +COPY scripts\new-test-bacula-dir.conf bin\bacula-dir.conf +COPY scripts\test-bacula-sd.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-testa-confs.cmd b/regress/win32/scripts/copy-testa-confs.cmd new file mode 100644 index 0000000000..4cc89ff02d --- /dev/null +++ b/regress/win32/scripts/copy-testa-confs.cmd @@ -0,0 +1,7 @@ +COPY scripts\testa-bacula-dir.conf bin\bacula-dir.conf +COPY scripts\test-bacula-sd.conf bin\bacula-sd.conf +COPY scripts\test-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/copy-win32-confs.cmd b/regress/win32/scripts/copy-win32-confs.cmd new file mode 100644 index 0000000000..b9f0ab72f6 --- /dev/null +++ b/regress/win32/scripts/copy-win32-confs.cmd @@ -0,0 +1,7 @@ +COPY scripts\win32-bacula-dir-tape.conf bin\bacula-dir.conf +COPY scripts\win32-bacula-sd-tape.conf bin\bacula-sd.conf +COPY scripts\win32-bacula-fd.conf bin\bacula-fd.conf +COPY scripts\test-console.conf bin\bconsole.conf + +REM get proper SD tape definitions +COPY scripts\win32_tape_options bin\tape_options diff --git a/regress/win32/scripts/crypto-bacula-fd.conf.in b/regress/win32/scripts/crypto-bacula-fd.conf.in new file mode 100644 index 0000000000..ec4152d2b8 --- /dev/null +++ b/regress/win32/scripts/crypto-bacula-fd.conf.in @@ -0,0 +1,36 @@ +# +# Default Bacula File Daemon Configuration file +# +# For Bacula release 1.33 +# +# There is not much to change here except perhaps the +# File daemon Name to +# + +# +# List Directors who are permitted to contact this File daemon +# +Director { + Name = @hostname@-dir + Password = "xevrjURYoCHhn26RaJoWbeWXEY/a3VqGKp/37tgWiuHc" +} + +# +# "Global" File daemon configuration specifications +# +FileDaemon { # this is me + Name = @hostname@-fd + FDport = 8102 # where we listen for the director + WorkingDirectory = "@working_dir@" + Pid Directory = "@piddir@" + SubSys Directory = "@subsysdir@" + PKI Signatures = Yes + PKI Encryption = Yes + PKI Keypair = "@scriptdir@/cryptokeypair.pem" +} + +# Send all messages except skipped files back to Director +Messages { + Name = Standard + director = @hostname@-dir = all, !terminate +} diff --git a/regress/win32/scripts/cryptokeypair.pem b/regress/win32/scripts/cryptokeypair.pem new file mode 100644 index 0000000000..440dcce4f0 --- /dev/null +++ b/regress/win32/scripts/cryptokeypair.pem @@ -0,0 +1,23 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBAKIc649Amif6weq+c8rVtS7jyn7E9oZ9Irrl9WviQZi0+J2OLgCi +PNaj/FzPhTIgBBRFEP0ZU5DfVv6CoXKbpr8CAwEAAQJAQbvUUFvzpi5pnxPmw+Jv ++zlmjIy1Icdv47UHFN3Dl3V0+X05g12xUlnyNKzo2jlSwkBi1w8AJCMV6/TnnLiI +AQIhAM4SH9cb01DUH+1O5gk90GgNYW1Aq2vL1vygm02kppi/AiEAyWQ9eAILPXhX +H3a7mEj8z1bCTBiVrhe73NUjim4QcgECIEC3hHRj8ruBwv0eODRSy27CNQTAuJVE +ESKJtfxuZzu1AiEAotXYFbahW/x3hUs9d25ca1EdHOYr8G3kSjRT3lQMHAECIHBl +uX+Ywc1jjWhc+vN2ZrLWkKMVbrd+SWOPUQGroM0j +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICKzCCAdWgAwIBAgIJAO4x/m+tHX8HMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMDYxMjA0MDMxMzUwWhcNMDcwMTAzMDMxMzUwWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKIc +649Amif6weq+c8rVtS7jyn7E9oZ9Irrl9WviQZi0+J2OLgCiPNaj/FzPhTIgBBRF +EP0ZU5DfVv6CoXKbpr8CAwEAAaOBpzCBpDAdBgNVHQ4EFgQUiGz2I+bks0nCHyCI +IwuV3DpDPMwwdQYDVR0jBG4wbIAUiGz2I+bks0nCHyCIIwuV3DpDPMyhSaRHMEUx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGSCCQDuMf5vrR1/BzAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBBQUAA0EAkjFYcs9rrpdURlBaNlbud68VlA5rU+Bv4keYx41DUmqo +sXtkQZENR9iYYYhOUso1/1dwQgrt3egjTZTtq7o5zw== +-----END CERTIFICATE----- diff --git a/regress/win32/scripts/disk-changer.cmd b/regress/win32/scripts/disk-changer.cmd new file mode 100644 index 0000000000..3efb1933ce --- /dev/null +++ b/regress/win32/scripts/disk-changer.cmd @@ -0,0 +1,201 @@ +@ECHO off +setlocal ENABLEDELAYEDEXPANSION +REM +REM +REM Bacula interface to virtual autoloader using disk storage +REM +REM $Id$ +REM +REM If you set in your Device resource +REM +REM Changer Command = "disk-changer %c %o %S %a %d" +REM you will have the following input to this script: +REM +REM So Bacula will always call with all the following arguments, even though +REM in some cases, not all are used. +REM +REM disk-changer "changer-device" "command" "slot" "archive-device" "drive-index" +REM %1 %2 %3 %4 %5 +REM +REM By default the autochanger has 10 Volumes and 1 Drive. +REM +REM Note: For this script to work, you *must" specify +REM Device Type = File +REM in each of the Devices associated with your AutoChanger resource. +REM +REM changer-device is the name of a file that overrides the default +REM volumes and drives. It may have: +REM maxslot=n where n is one based (default 10) +REM maxdrive=m where m is zero based (default 1 -- i.e. 2 drives) +REM +REM This code can also simulate barcodes. You simply put +REM a list of the slots and barcodes in the "base" directory/barcodes. +REM See below for the base directory definition. Example of a +REM barcodes file: +REM C:\TEMP\bacula\barcodes +REM 1:Vol001 +REM 2:Vol002 +REM ... +REM +REM archive-device is the name of the base directory where you want the +REM Volumes stored appended with \drive0 for the first drive; \drive1 +REM for the second drive, ... For example, you might use +REM C:\Temp\bacula\drive0 Note: you must not have a trailing slash, and +REM the string (e.g. \drive0) must be unique, and it must not match +REM any other part of the directory name. These restrictions could be +REM easily removed by any clever script jockey. +REM +REM Full example: disk-changer C:\Temp\bacula\conf load 1 C:\Temp\bacula\drive0 0 +REM +REM The Volumes will be created with names slot1, slot2, slot3, ... maxslot in the +REM base directory. In the above example the base directory is C:\Temp\bacula. +REM However, as with tapes, their Bacula Volume names will be stored inside the +REM Volume label. In addition to the Volumes (e.g. C:\Temp\bacula\slot1, +REM C:\Temp\bacula\slot3, ...) this script will create a C:\Temp\bacula\loadedn +REM file to keep track of what Slot is loaded. You should not change this file. +REM + +SET dbgfile=%CD%\disk-changer.log + +REM to turn on logging, uncomment the following line +IF NOT EXIST %dbgfile% COPY nul %dbgfile% >nul + +REM +REM check parameter count on commandline +REM +REM Check for special cases where only 2 arguments are needed, +REM all others are a minimum of 5 +REM +IF "%1" EQU "" goto :param_count_invalid +IF "%2" EQU "" goto :param_count_invalid +IF "%2" EQU "list" goto :param_count_valid +IF "%2" EQU "slots" goto :param_count_valid +IF "%3" EQU "" goto :param_count_invalid +IF "%4" EQU "" goto :param_count_invalid +IF "%5" EQU "" goto :param_count_invalid +GOTO :param_count_valid + +:param_count_invalid + echo Insufficient number of arguments given. + IF "%2" EQU "" ( + echo At least two arguments must be specified. + ) else echo Command expected 5 arguments. +:usage + ECHO. + ECHO usage: disk-changer ctl-device command [slot archive-device drive-index] + ECHO Valid commands are: unload, load, list, loaded, and slots. + EXIT /B 1 + +:param_count_valid + +REM Setup arguments +SET ctl=%1 +SET cmd=%2 +SET slot=%3 +SET device=%4 +SET drive=%5 + +REM set defaults +SET maxdrive=1 +SET maxslot=10 + +SET ctl=%ctl:/=\% +SET ctl=%ctl:\\=\% + +SET device=%device:/=\% +SET device=%device:\\=\% + +REM Pull in conf file +IF EXIST %ctl% CALL %ctl% + +FOR %%i IN ( %ctl% ) DO SET dirname=%%~dpi +IF NOT EXIST %dirname%nul ( + ECHO ERROR: Autochanger directory "%dirname%" does not exist. + ECHO You must create it. + EXIT /b 1 +) + +CALL :debug "Parms: %ctl% %cmd% %slot% %device% %drive%" +IF "%cmd%" EQU "unload" GOTO :cmdUnload +IF "%cmd%" EQU "load" GOTO :cmdLoad +IF "%cmd%" EQU "list" GOTO :cmdList +IF "%cmd%" EQU "loaded" GOTO :cmdLoaded +IF "%cmd%" EQU "slots" GOTO :cmdSlots +GOTO :cmdUnknown + +:cmdUnload + CALL :debug "Doing disk -f %ctl% unload %slot% %device% %drive%" + IF NOT EXIST %dirname%loaded%drive% ECHO 0 >%dirname%loaded%drive% + FOR /f %%i IN ( %dirname%loaded%drive% ) DO SET ld=%%i + + IF "%slot%" EQU "%ld%" ( + CALL :debug "Unloaded slot %ld% from drive %drive%" + ECHO 0 >%dirname%loaded%drive% + DEL %dirname%%device% >nul 2>nul + SET rtn=0 + ) ELSE ( + ECHO Storage Element %slot% is Already Full + CALL :debug "Storage Element %slot% is Already Full" + SET rtn=1 + ) + GOTO :cmdExit + +:cmdLoad + CALL :debug "Doing disk -f %ctl% load %slot% %device% %drive%" + SET ld=0 + IF NOT EXIST %dirname%loaded%drive% ECHO 0 >%dirname%loaded%drive% + FOR /f %%i IN ( %dirname%loaded%drive% ) DO SET ld=%%i + IF %ld% EQU 0 ( + IF NOT EXIST %dirname%slot%slot% COPY nul %dirname%slot%slot% >nul + DEL %device% + fsutil hardlink create %device% %dirname%slot%slot% >nul 2>&1 + SET rtn=%ERRORLEVEL% + IF !rtn! EQU 0 ( + ECHO %slot% >%dirname%loaded%drive% + CALL :debug "Loaded slot %slot% into drive %drive%" + ) ELSE ( + CALL :debug "Create hardlink failed, return = !rtn!" + ) + ) ELSE ( + ECHO Drive %drive% Full - Storage element %ld% loaded + CALL :debug "Drive %drive% Full - Storage element %ld% loaded" + ) + GOTO :cmdExit + +:cmdList + CALL :debug "Doing disk -f %ctl% -- to list volumes" + IF EXIST %dirname%barcodes ( + TYPE %dirname%barcodes + ) ELSE ( + FOR /l %%i IN ( 1, 1, %maxslot% ) DO ECHO %%i: + ) + SET rtn=0 + GOTO :cmdExit + +:cmdLoaded + CALL :debug "Doing disk -f %ctl% %drive% -- to find what is loaded" + IF EXIST %dirname%loaded%drive% ( TYPE %dirname%loaded%drive% ) ELSE ECHO 0 + SET rtn=0 + GOTO :cmdExit + +:cmdSlots + CALL :debug "Doing disk -f %ctl% -- to get count of slots" + ECHO %maxslot% + SET rtn=0 + GOTO :cmdExit + +:cmdExit + EXIT /b %rtn% + +:cmdUnknown + ECHO '%cmd%' is an invalid command. + GOTO :usage + +REM +REM log whats done +REM +:debug + IF NOT EXIST %dbgfile% GOTO :EOF + FOR /f "usebackq tokens=2-4,5-7 delims=/:. " %%i IN ( '%DATE% %TIME%' ) do SET TIMESTAMP=%%k%%i%%j-%%l:%%m:%%n + ECHO %TIMESTAMP% %* >> %dbgfile% + GOTO :EOF diff --git a/regress/win32/scripts/do_sed.cmd b/regress/win32/scripts/do_sed.cmd new file mode 100644 index 0000000000..a533a303f8 --- /dev/null +++ b/regress/win32/scripts/do_sed.cmd @@ -0,0 +1,73 @@ +IF "%1" == "" GOTO :usage +IF "%2" == "" GOTO :usage +IF "%3" == "" GOTO :usage +IF "%4" == "" GOTO :usage +IF "%5" == "" GOTO :usage +IF "%6" == "" GOTO :usage +GOTO :args_ok + +:usage +ECHO First arg must be email name +ECHO and the second must be the smtp or email host +ECHO and the third must be a tape drive +ECHO and the fourth must be a tape control name or nul +ECHO and the fifth must be the full path to the mtx program +ECHO and the sixth must be tape drive 1 or nul +EXIT /b 1 + +:args_ok +SET out=tmp\sed_tmp + +REM Create sed command script + +ECHO s;@sbindir@;%CD:\=/%/bin;g >%out% +ECHO s;@scriptdir@;%CD:\=/%/scripts;g >>%out% +ECHO s;@working_dir@;%CD:\=/%/working;g >>%out% +ECHO s;@piddir@;%CD:\=/%/working;g >>%out% +ECHO s;@subsysdir@;%CD:\=/%/working;g >>%out% +ECHO s;@job_email@;%1;g >>%out% +ECHO s;@smtp_host@;%2;g >>%out% +ECHO s;@tape_drive@;%3;g >>%out% +ECHO s;@autochanger@;%4;g >>%out% +ECHO s;@tmpdir@;%CD:\=/%/tmp;g >>%out% +ECHO s;@hostname@;localhost;g >>%out% +ECHO s;@changer_path@;%5;g >>%out% +ECHO s;@tape_drive1@;%6;g >>%out% +ECHO s;@disk_drive@;%CD:\=/%/tmp/disk-changer;g >>%out% +ECHO s;@smtp_program@;%CD:\=/%/bin/bsmtp;g >>%out% + +ECHO SET AUTOCHANGER=%4 >config_out.cmd +ECHO SET AUTOCHANGER_PATH=%5 >>config_out.cmd +ECHO SET TAPE_DRIVE1=%6 >>config_out.cmd + +REM process .in files with sed script +sed -f %out% %CD%\scripts\test-bacula-dir.conf.in >%CD%\scripts\test-bacula-dir.conf +sed -f %out% %CD%\scripts\new-test-bacula-dir.conf.in >%CD%\scripts\new-test-bacula-dir.conf +sed -f %out% %CD%\scripts\testa-bacula-dir.conf.in >%CD%\scripts\testa-bacula-dir.conf +sed -f %out% %CD%\scripts\test-bacula-fd.conf.in >%CD%\scripts\test-bacula-fd.conf +sed -f %out% %CD%\scripts\test-bacula-sd.conf.in >%CD%\scripts\test-bacula-sd.conf +sed -f %out% %CD%\scripts\test-console.conf.in >%CD%\scripts\test-console.conf +sed -f %out% %CD%\scripts\crypto-bacula-fd.conf.in >%CD%\scripts\crypto-bacula-fd.conf +sed -f %out% %CD%\scripts\bacula-dir-tape.conf.in >%CD%\scripts\bacula-dir-tape.conf +sed -f %out% %CD%\scripts\bacula-dir-migration.conf.in >%CD%\scripts\bacula-dir-migration.conf +sed -f %out% %CD%\scripts\win32-bacula-dir-tape.conf.in >%CD%\scripts\win32-bacula-dir-tape.conf +sed -f %out% %CD%\scripts\bacula-sd-tape.conf.in >%CD%\scripts\bacula-sd-tape.conf +sed -f %out% %CD%\scripts\bacula-sd-2tape.conf.in >%CD%\scripts\bacula-sd-2tape.conf +sed -f %out% %CD%\scripts\bacula-sd-migration.conf.in >%CD%\scripts\bacula-sd-migration.conf +sed -f %out% %CD%\scripts\bacula-sd-2disk.conf.in >%CD%\scripts\bacula-sd-2disk.conf +sed -f %out% %CD%\scripts\bacula-sd-2drive.conf.in >%CD%\scripts\bacula-sd-2drive.conf +sed -f %out% %CD%\scripts\bacula-sd-2disk-drive.conf.in >%CD%\scripts\bacula-sd-2disk-drive.conf +sed -f %out% %CD%\scripts\cleanup-tape.cmd.in >%CD%\scripts\cleanup-tape.cmd +sed -f %out% %CD%\scripts\cleanup-2tape.cmd.in >%CD%\scripts\cleanup-2tape.cmd +sed -f %out% %CD%\scripts\cleanup-2drive.cmd.in >%CD%\scripts\cleanup-2drive.cmd +sed -f %out% %CD%\scripts\prepare-two-tapes.cmd.in >%CD%\scripts\prepare-two-tapes.cmd +sed -f %out% %CD%\scripts\bacula-dir.conf.testrunscript.in >%CD%\scripts\bacula-dir.conf.testrunscript + +COPY %CD%\bin\bacula-sd.conf tmp\bacula-sd.tmp >nul +sed -e "s;C:\\Temp;%CD:\=/%/tmp;g" tmp\bacula-sd.tmp >%CD%\bin\bacula-sd.conf + +REM get proper SD tape definitions +COPY %CD%\scripts\win32_tape_options %CD%\bin\tape_options >nul + +DEL %out% +DEL tmp\*.tmp diff --git a/regress/win32/scripts/exclude-dev-test b/regress/win32/scripts/exclude-dev-test new file mode 100644 index 0000000000..4165ea1ae7 --- /dev/null +++ b/regress/win32/scripts/exclude-dev-test @@ -0,0 +1,5 @@ +dev/ptmx +dev/pts +dev/rd/c5d2 +dev/rd +dev/shm diff --git a/regress/win32/scripts/exclude-etc-test b/regress/win32/scripts/exclude-etc-test new file mode 100644 index 0000000000..f59ca8df2a --- /dev/null +++ b/regress/win32/scripts/exclude-etc-test @@ -0,0 +1 @@ +etc/mail/statistics diff --git a/regress/win32/scripts/exclude-lib-test b/regress/win32/scripts/exclude-lib-test new file mode 100644 index 0000000000..5be32f443b --- /dev/null +++ b/regress/win32/scripts/exclude-lib-test @@ -0,0 +1,5 @@ +lib/ld-2.2.5.so +lib/libtermcap.so.2.0.8 +lib/libc-2.2.5.so +lib/libnsl-2.2.5.so +lib/libnss_files-2.2.5.so diff --git a/regress/win32/scripts/flist b/regress/win32/scripts/flist new file mode 100644 index 0000000000..87f103defe --- /dev/null +++ b/regress/win32/scripts/flist @@ -0,0 +1,23 @@ +/build/configure +/build/src/stored/bextract +/build/src/tools/testfind +/build/Makefile.in +/build/src/dird/bacula-dir +/build/src/console/bconsole +/build/src/filed/bacula-fd +/build/src/findlib/find_one.c +/build/src/jcr.h +/build/platforms/Makefile.in +/build/platforms/redhat/Makefile.in +/build/scripts/Makefile.in +/build/src/win32/filed/winservice.cpp +/build/src/filed/restore.c +/build/autoconf/configure.in +/build/examples/afs-bacula +/build/src/win32/Makefile.inc.in +/build/src/win32/installer/winbacula.nsi +/build/autoconf/configure.in +/build/src/version.h +/build/src/lib/message.c +/build/src/lib/bnet_server.c +/build/src/lib/libbac.a diff --git a/regress/win32/scripts/functions.cmd b/regress/win32/scripts/functions.cmd new file mode 100644 index 0000000000..1a03141c14 --- /dev/null +++ b/regress/win32/scripts/functions.cmd @@ -0,0 +1,131 @@ +REM +REM A set of useful functions to be sourced in each test +REM + +SET routine=%1 +SHIFT + +GOTO %routine% + +:start_test + ECHO. + ECHO. + ECHO === Starting %TestName% at %TIME% === + ECHO === Starting %TestName% at %TIME% === >>working\log + ECHO. + GOTO :EOF + +:set_debug + SET debug=%1 + IF "%debug%" EQU 1 ( + SET out=tee + ) ELSE ( + SET out=output + ) + GOTO :EOF + +:run_bacula + IF %debug% EQU 1 ( + CALL scripts\bacula start + bin\bconsole -c bin\bconsole.conf nul 2>&1 + bin\bconsole -c bin\bconsole.conf nul 2>&1 + ) + GOTO :EOF + +:run_bconsole + IF %debug% EQU 1 ( + bin\bconsole -c bin\bconsole.conf nul 2>&1 + ) + GOTO :EOF + +:run_btape + IF %debug% EQU 1 ( + bin\btape -c bin\bacula-sd.conf DDS-4 tmp\log1.out 2>&1 + ) + GOTO :EOF + +:run_bscan + IF %debug% EQU 1 ( + bin\bscan %1 %2 %3 %4 %5 %6 %7 %8 %9 | tools\tee tmp\log.out + ) ELSE ( + bin\bscan %1 %2 %3 %4 %5 %6 %7 %8 %9 >nul 2>&1 + ) + GOTO :EOF + +:stop_bacula + CALL scripts\bacula stop >nul 2>&1 + GOTO :EOF + +:check_for_zombie_jobs + CALL scripts\check_for_zombie_jobs %1 %2 + GOTO :EOF + +:change_jobname + IF "%2" == "" ( + SET oldname=NightlySave + SET newname=%1 + ) ELSE ( + SET oldname=%1 + SET newname=%2 + ) + IF EXIST bin\1 DEL /f bin\1 + REN bin\bacula-dir.conf 1 + bin\sed -e "s;%oldname%;%newname%;g" bin\1 >bin\bacula-dir.conf +REM ECHO Job %oldname% changed to %newname% + GOTO :EOF + +:check_two_logs + tools\grep "^ Termination: *Backup OK" tmp\log1.out >nul 2>&1 + SET bstat=%ERRORLEVEL% + tools\grep "^ Termination: *Restore OK" tmp\log2.out >nul 2>&1 + SET rstat=%ERRORLEVEL% + GOTO :EOF + +:check_restore_diff + tools\diff -r build tmp\bacula-restores\%CD::=%\build >nul 2>&1 + SET dstat=%ERRORLEVEL% + GOTO :EOF + +:check_restore_tmp_build_diff + tools\diff -r tmp\build tmp\bacula-restores\%CD::=%\tmp\build >nul 2>&1 + SET dstat=%ERRORLEVEL% + GOTO :EOF + +:end_test + SET /a errcount=%bstat% + %rstat% + %dstat% + IF %errcount% NEQ 0 ( + ECHO. + ECHO. + ECHO !!!!! %TestName% Bacula source failed!!! !!!!! + ECHO !!!!! %TestName% failed!!! !!!!! >>test.out + IF %dstat% NEQ 0 ( + ECHO !!!!! Restored files differ !!!!! + ECHO !!!!! Restored files differ !!!!! >>test.out + ) ELSE ( + ECHO !!!!! Bad Job termination status !!!!! + ECHO !!!!! Bad Job termination status !!!!! >>test.out + ) + ECHO. + ) ELSE ( + ECHO ===== %TestName% Bacula source OK %TIME% ===== + ECHO ===== %TestName% OK %TIME% ===== >>test.out + IF %debug% EQU 0 scripts\cleanup + ) + SET errcount= + GOTO :EOF + +:copy_tape_confs + CALL scripts\copy-tape-confs >nul 2>&1 + CALL scripts\cleanup-tape + GOTO :EOF + +:copy_test_confs + CALL scripts\copy-test-confs >nul 2>&1 + CALL scripts\cleanup + GOTO :EOF diff --git a/regress/win32/scripts/install_bacula.cmd b/regress/win32/scripts/install_bacula.cmd new file mode 100644 index 0000000000..a799e3d25d --- /dev/null +++ b/regress/win32/scripts/install_bacula.cmd @@ -0,0 +1,76 @@ +REM Arguments: +REM 1 = Debug or Release +REM 2 = email address +REM 3 = mail server +REM 4 = tape device +REM 5 = changer device or nul +REM 6 = tape1 device or nul + +SETLOCAL ENABLEDELAYEDEXPANSION + +SET CATS=create_sqlite3_database.cmd drop_sqlite3_database.cmd drop_sqlite3_tables.cmd grant_sqlite3_privileges.cmd make_sqlite3_catalog_backup.cmd make_sqlite3_tables.cmd + +SET CONFS=bacula-dir.conf.in bacula-fd.conf.in bacula-sd.conf.in bconsole.conf.in + +CALL scripts\bacula stop + +IF NOT EXIST bin MKDIR bin + +COPY build\src\win32\installer\%1\*.exe bin >nul +COPY build\src\win32\installer\%1\*.dll bin >nul +COPY build\src\win32\installer\%1\*.manifest bin >nul +COPY build\src\win32\%1\*.pdb bin >nul +COPY build\src\win32\installer\%1\query.sql bin >nul + +COPY bin\cats_sqlite3.dll bin\bacula_cats3.dll >nul + +FOR /f %%i IN ( 'cmd /c openssl.exe rand -base64 33 2^>nul' ) DO SET CLIENT_PASSWORD=%%i +FOR /f %%i IN ( 'cmd /c openssl.exe rand -base64 33 2^>nul' ) DO SET STORAGE_PASSWORD=%%i +FOR /f %%i IN ( 'cmd /c openssl.exe rand -base64 33 2^>nul' ) DO SET DIRECTOR_PASSWORD=%%i +FOR /f %%i IN ( 'cmd /c openssl.exe rand -base64 33 2^>nul' ) DO SET MONITOR_PASSWORD=%%i + +ECHO s;@director_name@;localhost-dir;g >install.sed +ECHO s;@director_port@;8101;g >>install.sed +ECHO s;@storage_name@;localhost-sd;g >>install.sed +ECHO s;@storage_port@;8103;g >>install.sed +ECHO s;@client_name@;localhost-fd;g >>install.sed +ECHO s;@client_port@;8102;g >>install.sed + +REM ECHO s;@DISTVER@;$R2; + +ECHO s;@working_dir@;%CD:\=\\\\%\\\\working;g >>install.sed +ECHO s;@working_dir_cmd@;%CD:\=\\%\\working;g >>install.sed +ECHO s;@bin_dir@;%CD:\=\\\\%\\\\bin;g >>install.sed; +ECHO s;@bin_dir_cmd@;%CD:\=\\%\\bin;g >>install.sed +ECHO s;@BUILD_DIR@;%CD:\=/%/build;g >>install.sed +ECHO s;@director_address@;localhost;g >>install.sed +ECHO s;@client_address@;localhost;g >>install.sed +ECHO s;@storage_address@;localhost;g >>install.sed +ECHO s;@client_maxjobs@;2;g >>install.sed +ECHO s;@client_password@;%CLIENT_PASSWORD%;g >>install.sed +ECHO s;@storage_maxjobs@;10;g >>install.sed +ECHO s;@storage_password@;%STORAGE_PASSWORD%;g >>install.sed +ECHO s;@director_maxjobs@;1;g >>install.sed +ECHO s;@director_password@;%DIRECTOR_PASSWORD%;g >>install.sed +ECHO s;@job_email@;%2;g >>install.sed +ECHO s;@smtp_host@;%3;g >>install.sed +ECHO s;@monitor_name@;localhost-mon;g >>install.sed +ECHO s;@monitor_password@;%MONITOR_PASSWORD%;g >>install.sed +ECHO s;@tape_drive@;%4;g >>install.sed +ECHO s;@autochanger@;%5;g >>install.sed +ECHO s;@changer_path@;%6;g >>install.sed +ECHO s;@tape_drive1@;%7;g >>install.sed + +FOR %%i in ( %CATS% ) DO ( + SET NAME=%%i + SET TARGET=bin\!NAME:sqlite3=bacula! + tools\sed -f install.sed build\src\win32\installer\%1\!NAME! > !TARGET! +) + +FOR %%i in ( %CONFS% ) DO tools\sed -f install.sed build\src\win32\installer\%%i > bin\%%~ni + +tools\sed -f install.sed build\src\win32\installer\%1\make_sqlite3_tables.sql > bin\make_sqlite3_tables.sql +tools\sed -f install.sed build\src\win32\installer\%1\mtx-changer.cmd > bin\mtx-changer.cmd + +CALL scripts\bacula uninstall +CALL scripts\bacula install %CD%\bin diff --git a/regress/win32/scripts/new-test-bacula-dir.conf.in b/regress/win32/scripts/new-test-bacula-dir.conf.in new file mode 100644 index 0000000000..7302f0c73d --- /dev/null +++ b/regress/win32/scripts/new-test-bacula-dir.conf.in @@ -0,0 +1,326 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.39 or later +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRport = 8101 # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Standard +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in /tmp +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + +Job { + Name = "Crypto" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 4 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u bacula" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = /tmp/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = nul 2>&1 +MKDIR tmp\disk-changer diff --git a/regress/win32/scripts/prepare-two-tapes.cmd.in b/regress/win32/scripts/prepare-two-tapes.cmd.in new file mode 100644 index 0000000000..1bcd81898b --- /dev/null +++ b/regress/win32/scripts/prepare-two-tapes.cmd.in @@ -0,0 +1,13 @@ +REM +REM Create two blank tapes +REM +REM mt -f @tape_drive@ offline +@changer_path@ -f @autochanger@ unload +@changer_path@ -f @autochanger@ load 1 +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof +@changer_path@ -f @autochanger@ unload +@changer_path@ -f @autochanger@ load 2 +mt -f @tape_drive@ rewind +mt -f @tape_drive@ weof +REM @changer_path@ -f @autochanger@ unload diff --git a/regress/win32/scripts/setup.cmd b/regress/win32/scripts/setup.cmd new file mode 100644 index 0000000000..53df74dcfd --- /dev/null +++ b/regress/win32/scripts/setup.cmd @@ -0,0 +1,55 @@ +REM +REM Script to setup running Bacula regression tests +REM + +IF "%1" == "" GOTO :usage +IF "%2" == "" GOTO :usage +IF "%3" == "" GOTO :usage +IF "%4" == "" GOTO :usage +IF "%5" == "" GOTO :usage +IF "%6" == "" GOTO :usage +IF "%7" == "" GOTO :usage +GOTO :param_count_ok + +:usage +ECHO Incorrect number of arguments. +ECHO setup bacula-src build-type email-address smtp-host tape-device changer-device tape1-device +ECHO. +EXIT /b 1 + +:param_count_ok +RD /s /q build bin tmp working >nul 2>&1 +MKDIR tmp + +REM Copy new source +ECHO Copying source from %1 +SET SRC=%1 +FOR /r %1 %%i in ( debug release ) do IF EXIST %%i ECHO %%i | sed -e "s;%SRC:\=\\%\\;;" -e "/installer\\%2/d" -e "/win32\\%2/d" >>tmp\exclude_list +ECHO .bsc >>tmp\exclude_list +ECHO .ncb >>tmp\exclude_list + +XCOPY %1 build\ /EXCLUDE:tmp\exclude_list /e /q + +DEL build\src\win32\%2\winbacula*.exe + +CALL scripts\install_bacula %2 %3 %4 %5 %6 %7 + +CALL scripts\bacula stop >nul 2>&1 + +IF NOT EXIST working MKDIR working +ECHO Running database creation scripts +CALL bin\create_bacula_database +CALL bin\drop_bacula_tables +CALL bin\make_bacula_tables +CALL bin\grant_bacula_privileges + +REM Start and stop Bacula to ensure conf files are OK + +CALL scripts\bacula start +CALL scripts\bacula stop >nul 2>&1 + +REM +REM Save Bacula default conf files for later use +REM +COPY bin\*.conf scripts >nul +GOTO :EOF diff --git a/regress/win32/scripts/test-bacula-dir.conf.in b/regress/win32/scripts/test-bacula-dir.conf.in new file mode 100644 index 0000000000..93008cca82 --- /dev/null +++ b/regress/win32/scripts/test-bacula-dir.conf.in @@ -0,0 +1,312 @@ +# +# Default Bacula Director Configuration file +# +# The only thing that MUST be changed is to add one or more +# file or directory names in the Include directive of the +# FileSet resource. +# +# For Bacula release 1.33 +# +# You might also want to change the default email address +# from root to your address. See the "mail" and "operator" +# directives in the Messages resource. +# + +Director { # define myself + Name = @hostname@-dir + DIRport = 8101 # where we listen for UA connections + QueryFile = "@scriptdir@/query.sql" + WorkingDirectory = "@working_dir@" + PidDirectory = "@piddir@" + SubSysDirectory = "@subsysdir@" + Maximum Concurrent Jobs = 4 + Password = "pNvX1WiXnwv2C/F7E52LGvw6rKjbbPvu2kyuPa9pVaL3" # Console password + Messages = Daemon +} + +# +# Define the main nightly save backup job +# By default, this job will back up to disk in /tmp +Job { + Name = "NightlySave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" + Maximum Concurrent Jobs = 4 + SpoolData=yes +} + +Job { + Name = "MonsterSave" + Type = Backup + Client=@hostname@-fd + FileSet="Full Set" + Storage = File1 + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "VerifyVolume" + Type = Verify + Level = VolumeToCatalog + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +Job { + Name = "SparseTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + +Job { + Name = "CompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="CompressedSet" + Storage = File + Messages = Standard + Pool = Default + Maximum Concurrent Jobs = 4 + Write Bootstrap = "@working_dir@/NightlySave.bsr" +# Max Run Time = 15 seconds +} + +Job { + Name = "SparseCompressedTest" + Type = Backup + Client=@hostname@-fd + FileSet="SparseCompressedSet" + Storage = File + Messages = Standard + Pool = Default + Write Bootstrap = "@working_dir@/NightlySave.bsr" +} + + +# Backup the catalog database (after the nightly save) +Job { + Name = "BackupCatalog" + Type = Backup + Client=@hostname@-fd + FileSet="Catalog" +# Schedule = "WeeklyCycleAfterBackup" + Storage = File + Messages = Standard + Pool = Default + # This creates an ASCII copy of the catalog + RunBeforeJob = "@sbindir@/make_catalog_backup -u bacula" + # This deletes the copy of the catalog + RunAfterJob = "@sbindir@/delete_catalog_backup" + Write Bootstrap = "@working_dir@/BackupCatalog.bsr" +} + +# Standard Restore template, to be changed by Console program +Job { + Name = "RestoreFiles" + Type = Restore + Client=@hostname@-fd + FileSet="Full Set" + Storage = File + Messages = Standard + Pool = Default + Where = /tmp/bacula-restores +} + + +# List of files to be backed up +FileSet { + Name = "Full Set" + Include { Options { signature=MD5 } + File = nul 2>&1 +CALL scripts\prepare-two-disks + +CALL scripts\functions change_jobname localhost-fd %JobName% +CALL scripts\functions start_test + +ECHO %CD:\=/%/tmp/build >\tmp\file-list +IF NOT EXIST tmp\build MKDIR tmp\build +COPY build\src\dird\*.c tmp\build >nul 2>&1 + +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +REM Turn off Prefer Mounted Volumes so we use2 drives +COPY bin\bacula-dir.conf tmp\1 >nul 2>&1 +REM Comment the next line out to write everything to one drive +REM otherwise, it writes the two jobs to different drives +sed -e "s;# Prefer Mounted Volumes; Prefer Mounted Volumes;g" tmp\1 >bin\bacula-dir.conf + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\2drive-incremental-2disk.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\2drive-incremental-2disk.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +REM The restore should read from TestVolume002, which was on drive 1 +grep TestVolume002 tmp\log2.out >nul 2>&1 +IF %ERRORLEVEL% NEQ 0 SET rstat=%ERRORLEVEL% + +REM +REM Delete .c files because we will only restored the txt files +REM +DEL tmp\build\*.c +CALL scripts\functions check_restore_tmp_build_diff + +CALL scripts\functions end_test diff --git a/regress/win32/tests/2drive-incremental-2tape b/regress/win32/tests/2drive-incremental-2tape new file mode 100644 index 0000000000..25889acec6 --- /dev/null +++ b/regress/win32/tests/2drive-incremental-2tape @@ -0,0 +1,112 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +# This script uses the autochanger and two tapes +# +. config.out +if test x${TAPE_DRIVE1} = x/dev/null ; then + echo "Skipping 2drive-incremenatal-2tape test. No second drive." + exit +fi +TestName="2drive-incremental-2tape" +JobName="2drive2tape" +. scripts/functions +set_debug 0 + +cwd=`pwd` + +scripts/copy-2drive-confs +scripts/cleanup-2drive + +change_jobname localhost-fd $JobName + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +# Turn off Prefer Mounted Volumes so we use 2 drives +outf="tmp/sed_tmp" +echo "s%# Prefer Mounted Volumes% Prefer Mounted Volumes%g" >${outf} +cp ${cwd}/bin/bacula-dir.conf ${cwd}/tmp/1 +# Comment the next line out to write everything to one drive +# otherwise, it writes the two jobs to different drives +sed -f ${outf} ${cwd}/tmp/1 >${cwd}/bin/bacula-dir.conf + +start_test + +# Write out bconsole commands +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=1 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +run job=NightlySave yes +@sleep 3 +status storage=DDS-4 +wait +list volumes +list jobs +status storage=DDS-4 +messages +quit +END_OF_DATA + +run_bacula + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +status storage=DDS-4 +@#setdebug level=400 storage=DDS-4 +run level=Incremental job=NightlySave yes +wait +list volumes +status storage=DDS-4 +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# +# Delete .c files because we will only restored the txt files +# +rm -f tmp/build/*.c +check_restore_tmp_build_diff + +end_test diff --git a/regress/win32/tests/auto-label-test.bscr b/regress/win32/tests/auto-label-test.bscr new file mode 100644 index 0000000000..c33c0a6a42 --- /dev/null +++ b/regress/win32/tests/auto-label-test.bscr @@ -0,0 +1,35 @@ +@output nul +messages +@@out@ tmp/log1.out +status all +status all +list pools +messages +@#setdebug level=110 storage=File +run job=@JobName@ storage=File yes +list pools +list volumes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +count +ls * +dir * +find Makefile +pwd +lsmark +estimate +? +help +done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/auto-label-test.cmd b/regress/win32/tests/auto-label-test.cmd new file mode 100644 index 0000000000..218ded6d07 --- /dev/null +++ b/regress/win32/tests/auto-label-test.cmd @@ -0,0 +1,27 @@ +REM +REM Test if Bacula can automatically create a Volume label. +REM + +SET TestName=auto-label-test +SET JobName=AutoLabel + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +COPY bin\bacula-dir.conf tmp\1 +sed -e "s;# Label Format; Label Format;" tmp\1 >bin\bacula-dir.conf + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\auto-label-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/backup-bacula-tape b/regress/win32/tests/backup-bacula-tape new file mode 100644 index 0000000000..b4d72a0138 --- /dev/null +++ b/regress/win32/tests/backup-bacula-tape @@ -0,0 +1,117 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# We also use the purge and the relabel commands as +# well as a pile of status storage commands. +# +TestName="backup-bacula-tape" +JobName=backuptape +. scripts/functions +set_debug 0 + +scripts/copy-tape-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + + +# Write out bconsole commands +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +@#setdebug level=200 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +purge volume=TestVolume001 +relabel pool=Default storage=DDS-4 oldVolume=TestVolume001 volume=TestVolume002 slot=0 +purge volume=TestVolume002 +relabel pool=Default storage=DDS-4 oldVolume=TestVolume002 volume=TestVolume001 slot=0 +run job=$JobName yes +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +@sleep 1 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +status storage=DDS-4 +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# +# Now do a second backup after making a few changes +# +touch ${cwd}/build/src/dird/*.c +echo "test test" > ${cwd}/build/src/dird/xxx + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +list volumes +run job=$JobName yes +wait +list volumes +messages +@# +@# now do a second restore +@# +@$out tmp/log2.out +list volumes +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +list volumes +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/backup-bacula-test.bscr b/regress/win32/tests/backup-bacula-test.bscr new file mode 100644 index 0000000000..c6c22e9dae --- /dev/null +++ b/regress/win32/tests/backup-bacula-test.bscr @@ -0,0 +1,36 @@ +@output nul +messages +@@out@ tmp/log1.out +label volume=TestVolume001 +@#setdebug level=100 storage=File +run job=@JobName@ yes +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +@sleep 1 +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +@sleep 1 +status storage=File +status storage=File +status storage=File +status storage=File +status storage=File +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/backup-bacula-test.cmd b/regress/win32/tests/backup-bacula-test.cmd new file mode 100644 index 0000000000..dafec1d622 --- /dev/null +++ b/regress/win32/tests/backup-bacula-test.cmd @@ -0,0 +1,24 @@ +REM +REM Run a simple backup of the Bacula build directory +REM then restore it. +REM + +SET TestName=backup-bacula-test +SET JobName=backup +CALL scripts\functions set_debug 0 + +CALL scripts\cleanup +CALL scripts\copy-confs >nul 2>&1 + +CALL scripts\functions change_jobname Client1 %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\backup-bacula-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/backup-win32-tape b/regress/win32/tests/backup-win32-tape new file mode 100644 index 0000000000..a5631c17e6 --- /dev/null +++ b/regress/win32/tests/backup-win32-tape @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="backup-win32-tape" +JobName=backupwintape +. scripts/functions +set_debug 0 + +scripts/cleanup-tape +scripts/copy-win32-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=NightlySave yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$outt tmp/log2.out +@#restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +@#yes +@#wait +@#messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/bextract-test.bscr b/regress/win32/tests/bextract-test.bscr new file mode 100644 index 0000000000..090d518da0 --- /dev/null +++ b/regress/win32/tests/bextract-test.bscr @@ -0,0 +1,21 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +@#setdebug level=400 dir +@#setdebug level=400 storage=File1 +run job=@JobName@ storage=File1 yes +wait +messages +@# +@# now build the bsr file +@# +@@out@ tmp/log2.out +restore bootstrap=@topdir@/working/restore.bsr where=@topdir@/tmp/bacula-restores select all storage=File1 done +no +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/bextract-test.cmd b/regress/win32/tests/bextract-test.cmd new file mode 100644 index 0000000000..c119764c5e --- /dev/null +++ b/regress/win32/tests/bextract-test.cmd @@ -0,0 +1,29 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM split the archive into two volumes, then build a BSR with +REM the restore command and use bextract to restore the files. +REM +SET TestName=bextract-test +SET JobName=bextract + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\bextract-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +MKDIR %CD%\tmp\bacula-restores +bin\bextract -b working/restore.bsr -c bin/bacula-sd.conf %CD:\=/%/tmp %CD:\=/%/tmp/bacula-restores 2>&1 >nul +SET rstat=%ERRORLEVEL% +grep "^ Termination: *Backup OK" tmp\log1.out 2>&1 >nul +SET bstat=%ERRORLEVEL% +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/bscan-fast-tape b/regress/win32/tests/bscan-fast-tape new file mode 100644 index 0000000000..24e39105f9 --- /dev/null +++ b/regress/win32/tests/bscan-fast-tape @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then +# do a bscan and restore. +# It should require at least 4 different bsrs. +# +TestName="bscan-tape" +JobName=bscantape +. scripts/functions +set_debug 1 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +# sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +setdebug level=2 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +echo "Starting Bacula tape writing" +#bin/btape -c bin/bacula-sd.conf /dev/nst0 </dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +echo "Begin attempt to read tape that crashes the system" +echo "volume=TestVolume001" >tmp/bscan.bsr +strace -o strace.new bin/bscan -d200 -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 +exit +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula +rm -f ${cwd}/build/src/lib/dummy + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/bscan-tape b/regress/win32/tests/bscan-tape new file mode 100644 index 0000000000..b477760078 --- /dev/null +++ b/regress/win32/tests/bscan-tape @@ -0,0 +1,142 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then +# do a bscan and restore. +# It should require at least 4 different bsrs. +# +TestName="bscan-tape" +JobName=bscantape +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +estimate job=$JobName listing +estimate job=$JobName listing +estimate job=$JobName listing +messages +@$out tmp/log1.out +setdebug level=2 storage=DDS-4 +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +run job=$JobName level=Full yes +wait +run job=$JobName level=Full yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +# +# run a second job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +echo "Backup 2 done" +touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a third job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +echo "Backup 3 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +#echo "abc" > ${cwd}/build/src/lib/dummy +# +# run a fourth job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA + +run_bacula + +scripts/check_for_zombie_jobs storage=DDS-4 +stop_bacula + +echo "Backup 4 done" +# +# now drop and recreate the database +# +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +echo "volume=TestVolume001" >tmp/bscan.bsr +bin/bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf DDS-4 2>&1 >/dev/null + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula +rm -f ${cwd}/build/src/lib/dummy + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/bscan-test.1.bscr b/regress/win32/tests/bscan-test.1.bscr new file mode 100644 index 0000000000..2ed6803e27 --- /dev/null +++ b/regress/win32/tests/bscan-test.1.bscr @@ -0,0 +1,24 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=File1 +TestVolume001 +label storage=File1 +TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=@JobName@ storage=File1 +yes +wait +messages +@@out@ nul +@# +@# now purge the Volume +@# +purge volume=TestVolume001 +purge volume=TestVolume002 +delete volume=TestVolume001 +yes +delete volume=TestVolume002 +yes +messages +quit diff --git a/regress/win32/tests/bscan-test.2.bscr b/regress/win32/tests/bscan-test.2.bscr new file mode 100644 index 0000000000..9e80679312 --- /dev/null +++ b/regress/win32/tests/bscan-test.2.bscr @@ -0,0 +1,13 @@ +@@out@ nul +messages +@@out@ tmp/log2.out +@# +@# now do a restore +@# +@#setdebug level=400 storage=File1 +restore bootstrap=@topdir@/tmp/bscan.bsr where=@topdir@/tmp/bacula-restores select all storage=File1 done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/bscan-test.cmd b/regress/win32/tests/bscan-test.cmd new file mode 100644 index 0000000000..5b71db8c1a --- /dev/null +++ b/regress/win32/tests/bscan-test.cmd @@ -0,0 +1,42 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM split the archive into two volumes then bscan it +REM into the catalog after the backup. It also to a limited +REM extent tests the purge volume and delete volume commands. +REM + +SET TestName=bscan-test +SET JobName=bscan + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\bscan-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +ECHO volume=TestVolume001^|TestVolume002 >tmp\bscan.bsr + +IF %debug% EQU 1 ( + bin\bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf %CD:\=/%/tmp | tools\tee tmp\log.out +) ELSE ( + bin\bscan -w working -m -s -v -b tmp/bscan.bsr -c bin/bacula-sd.conf %CD:\=/%/tmp >nul 2>&1 +) + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\bscan-test.2.bscr >tmp\bconcmds + +REM now run restore +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/bsr-opt-test.bscr b/regress/win32/tests/bsr-opt-test.bscr new file mode 100644 index 0000000000..1f0576b930 --- /dev/null +++ b/regress/win32/tests/bsr-opt-test.bscr @@ -0,0 +1,24 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=@JobName@ storage=File1 yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore bootstrap=@topdir@/working/restore.bsr where=@topdir@/tmp/bacula-restores select storage=File1 +unmark * +cd @topdir@/build/src/cats +mark * +ls +done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/bsr-opt-test.cmd b/regress/win32/tests/bsr-opt-test.cmd new file mode 100644 index 0000000000..9f816ab084 --- /dev/null +++ b/regress/win32/tests/bsr-opt-test.cmd @@ -0,0 +1,57 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM split the archive into two volumes, then restore +REM files on only one of the volumes and ensure that +REM the other volume is not used. I.e. bsr optimization +REM works. +REM +SET TestName=bsr-opt-test +SET JobName=bsr-opt + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\bsr-opt-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula +REM +REM This test is not really reliable. What we want to do is +REM to select files on only one Volume, then insure here +REM that only one Volume is chosen. +REM +grep TestVolume002 working\restore.bsr >nul 2>&1 +SET bsrstat=%ERRORLEVEL% +CALL scripts\functions check_two_logs + +diff -r build\src\cats tmp\bacula-restores\%CD::=%\build\src\cats >nul 2>&1 +SET /A errcount = %bsrstat% + %bstat% + %rstat% +IF %errcount% NEQ 0 ( + ECHO. + ECHO. + ECHO !!!!! bsr-opt-test Bacula source failed!!! !!!!! + ECHO !!!!! bsr-opt-test failed!!! !!!!! >>test.out + + SET /A errcount = %bstat% + %rstat% + IF %errcount% NEQ 0 ( + ECHO !!!!! Bad Job termination status !!!!! + ECHO !!!!! Bad Job termination status !!!!! >>test.out + ) ELSE IF %bsrstat% NEQ 0 ( + ECHO !!!!! Volume selection error !!!!! + ECHO !!!!! Volume selection error !!!!! >>test.out + ) ELSE ( + ECHO !!!!! Restored files differ !!!!! + ECHO !!!!! Restored files differ !!!!! >>test.out + ) + ECHO. +) ELSE ( + ECHO ===== bsr-opt-test Bacula source OK %TIME% ===== + ECHO ===== bsr-opt-test OK %TIME% ===== >>test.out + CALL scripts\cleanup +) diff --git a/regress/win32/tests/btape-fill-full-tape b/regress/win32/tests/btape-fill-full-tape new file mode 100644 index 0000000000..f4ba59fb5b --- /dev/null +++ b/regress/win32/tests/btape-fill-full-tape @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Test the fill command in btape +# +TestName="btape-fill-full-tape" +JobName=AutoLabel +. scripts/functions +set_debug 0 + +scripts/copy-tape-confs +scripts/cleanup-tape + +change_jobname $JobName +start_test + +bin/btape -c bin/bacula-sd.conf DDS-4 <&1 >tmp/log1.out +fill +s + +quit +END_OF_DATA + + +grep "^The last block on the tape matches\. Test succeeded\." tmp/log1.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " !!!!! btape fill test failed!!! !!!!! " + echo " !!!!! btape fill test failed!!! !!!!! " >>test.out + echo " " +else + echo " ===== btape fill test OK ===== " + echo " ===== btape fill test OK ===== " >>test.out +# scripts/cleanup +fi diff --git a/regress/win32/tests/btape-fill-tape b/regress/win32/tests/btape-fill-tape new file mode 100644 index 0000000000..43c9ce35b5 --- /dev/null +++ b/regress/win32/tests/btape-fill-tape @@ -0,0 +1,38 @@ +#!/bin/sh +# +# Test the fill command in btape +# +TestName="btape-fill-tape" +JobName=filltape +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# MaximumVolumeSize% MaximumVolumeSize%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +start_test + +cat <tmp/bconcmds +fill +s +quit +END_OF_DATA + +run_btape DDS-4 + +grep "^The last block on the tape matches\. Test succeeded\." tmp/log1.out 2>&1 >/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " !!!!! btape fill test failed!!! !!!!! " + echo " !!!!! btape fill test failed!!! !!!!! " >>test.out + echo " " +else + echo " ===== btape fill test OK ===== " + echo " ===== btape fill test OK ===== " >>test.out +# scripts/cleanup +fi diff --git a/regress/win32/tests/compressed-test.bscr b/regress/win32/tests/compressed-test.bscr new file mode 100644 index 0000000000..d46459f878 --- /dev/null +++ b/regress/win32/tests/compressed-test.bscr @@ -0,0 +1,23 @@ +@output +messages +@@out@ tmp/log1.out +status all +status all +messages +label storage=File volume=TestVolume001 +run job=@JobName@ storage=File yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/compressed-test.cmd b/regress/win32/tests/compressed-test.cmd new file mode 100644 index 0000000000..2097c6124f --- /dev/null +++ b/regress/win32/tests/compressed-test.cmd @@ -0,0 +1,24 @@ +REM +REM Run a simple backup of the Bacula build directory using the compressed option +REM then restore it. +REM +SET TestName=compressed-test +SET JobName=compressed + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\compressed-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/concurrent-jobs-test.bscr b/regress/win32/tests/concurrent-jobs-test.bscr new file mode 100644 index 0000000000..1799fd6e0b --- /dev/null +++ b/regress/win32/tests/concurrent-jobs-test.bscr @@ -0,0 +1,23 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ level=Full yes +run job=@JobName@ level=Full yes +run job=@JobName@ level=Full yes +run job=@JobName@ level=Full yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/concurrent-jobs-test.cmd b/regress/win32/tests/concurrent-jobs-test.cmd new file mode 100644 index 0000000000..9c36b48c7e --- /dev/null +++ b/regress/win32/tests/concurrent-jobs-test.cmd @@ -0,0 +1,35 @@ +REM +REM Run two jobs at the same time +REM + +SET TestName=concurrent-jobs-test +SET JobName=concurrent-jobs + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/largefile >\tmp\file-list +ECHO Creating a 50MB file with bacula-dir data ... +tools\dd if=bin/bacula-dir.exe of=%CD:\=/%/tmp/1 bs=1024 count=512 >nul 2>&1 +COPY /b %CD%\tmp\1+%CD%\tmp\1+%CD%\tmp\1+%CD%\tmp\1 %CD%\tmp\2 >nul 2>&1 +DEL %CD%\tmp\1 +COPY /b %CD%\tmp\2+%CD%\tmp\2+%CD%\tmp\2+%CD%\tmp\2+%CD%\tmp\2 %CD%\tmp\3 >nul 2>&1 +DEL %CD%\tmp\2 +COPY /b %CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3 %CD%\tmp\largefile >nul 2>&1 +DEL %CD%\tmp\3 + +ECHO largefile created + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\concurrent-jobs-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +diff tmp\largefile tmp\bacula-restores\%CD::=%\tmp\largefile >nul 2>&1 +SET dstat=%ERRORLEVEL% +CALL scripts\functions end_test diff --git a/regress/win32/tests/dev-test-root b/regress/win32/tests/dev-test-root new file mode 100644 index 0000000000..40a9bb2402 --- /dev/null +++ b/regress/win32/tests/dev-test-root @@ -0,0 +1,85 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +MUID=`/usr/bin/id -u` +if [ $MUID != 0 ] ; then + echo " " + echo "You must be root to run this test." + echo " ===== !!!! dev-test-root not run !!!! ===== " + echo " ===== !!!! dev-test-root not run !!!! ===== " >>test.out + echo " " + exit 1 +fi +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "/dev" >${cwd}/tmp/file-list + +echo " " +echo " " +echo " === Starting dev-test-root test ===" +echo " " +echo " === Note, this test can fail for trivial ===" +echo " === reasons on non-Linux systems. ===" +echo " " +echo " " + +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test dev >${cwd}/tmp/restored +cd ${cwd}/tmp +# +# Use sed to cut out parts that *always* change +# +cat >sed.scr <1 +sed -f sed.scr 1 | sort >original +# +mv -f restored 1 +sed -f sed.scr 1 | sort >restored +rm -f sed.scr +# +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! dev-test-root failed !!!! ===== " + echo " ===== !!!! dev-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== dev-test-root OK ===== " + echo " ===== dev-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/win32/tests/differential-test.1.bscr b/regress/win32/tests/differential-test.1.bscr new file mode 100644 index 0000000000..5b23122bdc --- /dev/null +++ b/regress/win32/tests/differential-test.1.bscr @@ -0,0 +1,9 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume002 +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/differential-test.2.bscr b/regress/win32/tests/differential-test.2.bscr new file mode 100644 index 0000000000..c8ddb49849 --- /dev/null +++ b/regress/win32/tests/differential-test.2.bscr @@ -0,0 +1,9 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +@# Force differential on the second Volume +update volume=TestVolume002 VolStatus=Used +run level=differential job=@JobName@ yes +wait +messages +@@out@ diff --git a/regress/win32/tests/differential-test.3.bscr b/regress/win32/tests/differential-test.3.bscr new file mode 100644 index 0000000000..3d2b98e26b --- /dev/null +++ b/regress/win32/tests/differential-test.3.bscr @@ -0,0 +1,16 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +run level=incremental job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores storage=File file=<@topdir@/tmp/restore-list +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/differential-test.cmd b/regress/win32/tests/differential-test.cmd new file mode 100644 index 0000000000..6ffdff055c --- /dev/null +++ b/regress/win32/tests/differential-test.cmd @@ -0,0 +1,48 @@ +REM +REM Run a simple backup of the Bacula build directory then create some +REM new files, do a differential and restore those two files. +REM +SET TestName=differential-test +SET JobName=differential + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/build >\tmp\file-list +MKDIR tmp\build +COPY build\src\dird\*.c tmp\build >nul 2>&1 + +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\differential-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\differential-test.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +CALL scripts\functions check_for_zombie_jobs storage=File +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\differential-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +REM +REM Delete .c files because we will only restore the txt files +REM +DEL tmp\build\*.c +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/eot-fail-tape b/regress/win32/tests/eot-fail-tape new file mode 100644 index 0000000000..aff28cd4dd --- /dev/null +++ b/regress/win32/tests/eot-fail-tape @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to two tapes where the maximum tape file size is set to 1M +# +TestName="eot-fail-tape" +JobName=eotfailtape +. scripts/functions +set_debug 0 + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +out="tmp/sed_tmp" +echo "s%# Maximum File Size% Maximum File Size%g" >${out} +cp -f ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed -f ${out} ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +update Volume=TestVolume001 MaxVolBytes=3000000 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@tee +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/etc-test-root b/regress/win32/tests/etc-test-root new file mode 100644 index 0000000000..c9c9ac6aec --- /dev/null +++ b/regress/win32/tests/etc-test-root @@ -0,0 +1,70 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +MUID=`/usr/bin/id -u` +if [ $MUID != 0 ] ; then + echo " " + echo "You must be root to run this test." + echo " ===== !!!! etc-test-root not run !!!! ===== " + echo " ===== !!!! etc-test-root not run !!!! ===== " >>test.out + echo " " + exit 1 +fi +echo " " +echo " " +echo " === Starting /etc save/restore test ===" +echo " " +echo " " +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "/etc" >${cwd}/tmp/file-list + +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/1 +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-etc-test etc >${cwd}/tmp/2 +sort <${cwd}/tmp/1 >${cwd}/tmp/original +sort <${cwd}/tmp/2 >${cwd}/tmp/restored +rm -f ${cwd}/tmp/1 ${cwd}/tmp/2 +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/null +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! etc-test-root failed !!!! ===== " + echo " ===== !!!! etc-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== etc-test-root OK ===== " + echo " ===== etc-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/win32/tests/fixed-block-size-tape b/regress/win32/tests/fixed-block-size-tape new file mode 100644 index 0000000000..e3cfb4d5a8 --- /dev/null +++ b/regress/win32/tests/fixed-block-size-tape @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where we set the minimum and maximum block +# sizes. +# +TestName="fixed-block-size-tape" +JobName=fixedblocksize +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +echo "s%# Maximum Block Size% Maximum Block Size%" >${cwd}/tmp/2 +echo "s%# Minimum Block Size% Minimum Block Size%" >>${cwd}/tmp/2 +sed -f ${cwd}/tmp/2 ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf +if [ $? != 0 ] ; then + echo " " + echo " " + echo "!!!! sed problem in Fixed Block Size test !!!!!" + echo " " + exit 1 +fi +rm -f ${cwd}/tmp/1 ${cwd}/tmp/2 + +change_jobname NightlySave $JobName +start_test + + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/four-concurrent-jobs-tape b/regress/win32/tests/four-concurrent-jobs-tape new file mode 100644 index 0000000000..ada9d45587 --- /dev/null +++ b/regress/win32/tests/four-concurrent-jobs-tape @@ -0,0 +1,56 @@ +#!/bin/sh +# +# Run four jobs at the same time +# +TestName="four-concurrent-jobs-tape" +JobName=FourConcurrentJobs +. scripts/functions +set_debug 0 + +scripts/cleanup-tape +scripts/copy-tape-confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +run job=$JobName level=Full Storage=DDS-4 yes +@sleep 2 +status dir +@sleep 5 +status dir +status storage=DDS-4 +messages +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/four-concurrent-jobs-test.bscr b/regress/win32/tests/four-concurrent-jobs-test.bscr new file mode 100644 index 0000000000..cdae631049 --- /dev/null +++ b/regress/win32/tests/four-concurrent-jobs-test.bscr @@ -0,0 +1,50 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File1 +TestVolume001 +label storage=File1 +TestVolume002 +update Volume=TestVolume001 MaxVolBytes=100000000 +@#50000000 +@#12 +run job=@JobName@ level=Full Storage=File1 +yes +reload +run job=@JobName@ level=Full Storage=File1 +yes +reload +run job=@JobName@ level=Full Storage=File1 +yes +reload +run job=@JobName@ level=Full Storage=File1 +yes +reload +reload +reload +reload +@sleep 2 +status dir +reload +@sleep 5 +messages +reload +reload +wait +reload +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +reload +reload +messages +@output +quit diff --git a/regress/win32/tests/four-concurrent-jobs-test.cmd b/regress/win32/tests/four-concurrent-jobs-test.cmd new file mode 100644 index 0000000000..0530baa8f0 --- /dev/null +++ b/regress/win32/tests/four-concurrent-jobs-test.cmd @@ -0,0 +1,23 @@ +REM +REM Run two jobs at the same time +REM +SET TestName=four-concurrent-jobs-test +SET JobName=Four-concurrent-jobs + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-concurrent-jobs-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/four-jobs-tape b/regress/win32/tests/four-jobs-tape new file mode 100644 index 0000000000..cf2c0afb3b --- /dev/null +++ b/regress/win32/tests/four-jobs-tape @@ -0,0 +1,153 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then finally restore. +# It should require at least 4 different bsrs. +# +TestName="four-jobs-tape" +JobName=fourjobstape +. scripts/functions +set_debug 0 + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +estimate job=$JobName listing +estimate job=$JobName listing +estimate job=$JobName listing +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 1 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/dird/*.c ${cwd}/build/src/dird/*.o +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o + +# +# run a second job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 2 done" +touch ${cwd}/build/src/dird/*.c +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a third job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 3 done" +# make some files for the incremental to pick up +touch ${cwd}/build/src/lib/*.c ${cwd}/build/src/lib/*.o +# +# run a fourth job +# +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Incremental yes +wait +messages +quit +END_OF_DATA +if test "$debug" -eq 1 ; then + bin/bacula start + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf +else + bin/bacula start 2>&1 >/dev/null + cat tmp/bconcmds | bin/bconsole -c bin/bconsole.conf 2>&1 >/dev/null +fi + +scripts/check_for_zombie_jobs storage=DDS-4 +echo "Backup 4 done" +# +# now do several restores to ensure we cleanup between jobs +# +cat <tmp/bconcmds +@$out /dev/null +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +@$out tmp/log2.out +@# +@# now unmount the tape and start two restores +@# at the same time +@# +unmount storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +mount storage=DDS-4 +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/four-jobs-test.1.bscr b/regress/win32/tests/four-jobs-test.1.bscr new file mode 100644 index 0000000000..462c2545f8 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.1.bscr @@ -0,0 +1,11 @@ +@output nul +estimate job=@JobName@ listing +estimate job=@JobName@ listing +estimate job=@JobName@ listing +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/four-jobs-test.2.bscr b/regress/win32/tests/four-jobs-test.2.bscr new file mode 100644 index 0000000000..02fdc49786 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.2.bscr @@ -0,0 +1,8 @@ +@output nul +messages +@@out@ tmp/log1.out +run job=@JobName@ +yes +wait +messages +quit diff --git a/regress/win32/tests/four-jobs-test.3.bscr b/regress/win32/tests/four-jobs-test.3.bscr new file mode 100644 index 0000000000..6da93295f1 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.3.bscr @@ -0,0 +1,8 @@ +@output nul +messages +@output tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/four-jobs-test.4.bscr b/regress/win32/tests/four-jobs-test.4.bscr new file mode 100644 index 0000000000..6da93295f1 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.4.bscr @@ -0,0 +1,8 @@ +@output nul +messages +@output tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/four-jobs-test.5.bscr b/regress/win32/tests/four-jobs-test.5.bscr new file mode 100644 index 0000000000..30bf4a7053 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.5.bscr @@ -0,0 +1,17 @@ +@output nul +restore where=@topdir@/tmp/bacula-restores select all storage=File done +yes +wait +restore where=@topdir@/tmp/bacula-restores select all storage=File done +yes +wait +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/four-jobs-test.cmd b/regress/win32/tests/four-jobs-test.cmd new file mode 100644 index 0000000000..72b00e0210 --- /dev/null +++ b/regress/win32/tests/four-jobs-test.cmd @@ -0,0 +1,74 @@ +REM +REM Run a simple backup of the Bacula build directory using the compressed option +REM then backup four times, each with incremental then finally restore. +REM It should require at least 4 different bsrs. +REM +SET TestName=four-jobs-test +SET JobName=SpanVol + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >${cwd}/tmp/file-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-jobs-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO Backup 1 done + +REM make some files for the incremental to pick up +tools\touch %CD:\=/%/build/src/dird/*.c +tools\touch %CD:\=/%/build/src/lib/*.c + +REM +REM run a second job +REM +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-jobs-test.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO Backup 2 done + +tools\touch %CD:\=/%/build/src/dird/*.c +tools\touch %CD:\=/%/build/src/lib/*.c + +REM +REM run a third job +REM +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-jobs-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO Backup 3 done + +REM make some files for the incremental to pick up +tools\touch %CD:\=/%/build/src/lib/*.c + +REM +REM run a fourth job +REM +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-jobs-test.4.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO Backup 4 done +REM +REM now do several restores to ensure we cleanup between jobs +REM +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\four-jobs-test.5.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/hardlink-test b/regress/win32/tests/hardlink-test new file mode 100644 index 0000000000..05233e2f84 --- /dev/null +++ b/regress/win32/tests/hardlink-test @@ -0,0 +1,66 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="hardlink-test" +JobName=hardlink +. scripts/functions +set_debug 0 + +if test ! -d weird-files ; then + echo " " + echo "Weird files not configured. Test not run." + exit 0 +fi + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +change_jobname NightlySave $JobName +# +# Note, we save the weird-files directory twice on purpose +# because this causes problems with hard linked files +# that are only saved once. In 1.33, Bacula now deals +# with this situation. +# +echo "${cwd}/weird-files" >${cwd}/tmp/file-list +echo "${cwd}/weird-files" >>${cwd}/tmp/file-list + +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File +TestVolume001 +run job=$JobName +yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=File +5 +cd ${cwd}/weird-files/subdir +mark another-hardlink +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +check_two_logs +diff ${cwd}/weird-files/subdir/another-hardlink \ + ${cwd}/tmp/bacula-restores/${cwd}/weird-files/subdir/another-hardlink 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/win32/tests/incremental-2disk.1.bscr b/regress/win32/tests/incremental-2disk.1.bscr new file mode 100644 index 0000000000..fdbc4a7615 --- /dev/null +++ b/regress/win32/tests/incremental-2disk.1.bscr @@ -0,0 +1,9 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-2disk.2.bscr b/regress/win32/tests/incremental-2disk.2.bscr new file mode 100644 index 0000000000..76032d1a1d --- /dev/null +++ b/regress/win32/tests/incremental-2disk.2.bscr @@ -0,0 +1,21 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=Incremental job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores +7 +<@topdir@/tmp/restore-list + +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/incremental-2disk.cmd b/regress/win32/tests/incremental-2disk.cmd new file mode 100644 index 0000000000..a51fc8ad05 --- /dev/null +++ b/regress/win32/tests/incremental-2disk.cmd @@ -0,0 +1,55 @@ +REM +REM Run a simple backup of the Bacula build directory then create some +REM new files, do an Incremental and restore those two files. +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=incremental-2disk +SET JobName=Inc2disk + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\functions stop_bacula + +CALL bin\drop_bacula_tables >nul 2>&1 +CALL bin\make_bacula_tables >nul 2>&1 +CALL bin\grant_bacula_privileges >nul 2>&1 + +CALL scripts\copy-2disk-confs >nul 2>&1 +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/tmp/build >\tmp\file-list +IF NOT EXIST tmp\build MKDIR tmp\build + +COPY build\src\dird\*.c tmp\build >nul 2>&1 +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +CALL scripts\functions change_jobname %JobName% +CALL scripts\functions start_test + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-2disk.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula + +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-2disk.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula +REM +REM Delete .c files because we will only restored the txt files +REM +DEL tmp\build\*.c + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/incremental-2tape.1.bscr b/regress/win32/tests/incremental-2tape.1.bscr new file mode 100644 index 0000000000..b5fa189e47 --- /dev/null +++ b/regress/win32/tests/incremental-2tape.1.bscr @@ -0,0 +1,9 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 Pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 Pool=Default drive=0 +run job=NightlySave yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-2tape.2.bscr b/regress/win32/tests/incremental-2tape.2.bscr new file mode 100644 index 0000000000..f57357f747 --- /dev/null +++ b/regress/win32/tests/incremental-2tape.2.bscr @@ -0,0 +1,21 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=Incremental job=NightlySave yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores +7 +<@topdir@/tmp/restore-list + +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/incremental-2tape.cmd b/regress/win32/tests/incremental-2tape.cmd new file mode 100644 index 0000000000..2a646a0edd --- /dev/null +++ b/regress/win32/tests/incremental-2tape.cmd @@ -0,0 +1,48 @@ +REM +REM Run a simple backup of the Bacula build directory then create some +REM new files, do an Incremental and restore those two files. +REM +REM This script uses the autochanger and two tapes +REM +SET TestName=incremental-2tape +SET JobName=inctwotape +CALL scripts\functions set_debug 0 + +CALL config_out +IF "%AUTOCHANGER%" == "nul" ( + ECHO incremental-2tape test skipped. No autochanger. + EXIT +) + +CALL scripts\functions stop_bacula +CALL drop_bacula_tables >nul 2>&1 +CALL make_bacula_tables >nul 2>&1 +CALL grant_bacula_privileges >nul 2>&1 + +CALL scripts\copy-2tape-confs +CALL scripts\cleanup-2tape +ECHO %CD:\=/%/tmp/build >\tmp\file-list +IF NOT EXIST tmp\build MKDIR tmp\build +COPY build\src\dird\*.c tmp\build +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-2tape.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula + +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-2tape.2.bscr >tmp\bconcmds +CALL scripts\functions run_bconsole +CALL scripts\bacula stop_bacula +CALL scripts\bacula check_two_logs +REM +REM Delete .c files because we will only restore the txt files +REM +DEL tmp\build\*.c +CALL scripts\bacula check_restore_tmp_build_diff +CALL scripts\bacula end_test diff --git a/regress/win32/tests/incremental-tape b/regress/win32/tests/incremental-tape new file mode 100644 index 0000000000..11cb02c357 --- /dev/null +++ b/regress/win32/tests/incremental-tape @@ -0,0 +1,76 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory then create some +# new files, do an Incremental and restore those two files. +# +TestName="incremental-tape" +JobName=IncTape +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/tmp/build" >${cwd}/tmp/file-list +if test ! -d ${cwd}/tmp/build ; then + mkdir ${cwd}/tmp/build +fi +cp -p ${cwd}/build/src/dird/*.c ${cwd}/tmp/build +cd ${cwd}/tmp +echo "${cwd}/tmp/build/ficheriro1.txt" >restore-list +echo "${cwd}/tmp/build/ficheriro2.txt" >>restore-list +cd ${cwd} + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + +echo "ficheriro1.txt" >${cwd}/tmp/build/ficheriro1.txt +echo "ficheriro2.txt" >${cwd}/tmp/build/ficheriro2.txt + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +run level=Incremental job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 +7 +<${cwd}/tmp/restore-list + +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +# +# Delete .c files because we will only restored the txt files +# +rm -f tmp/build/*.c + +check_two_logs +check_restore_tmp_build_diff +end_test diff --git a/regress/win32/tests/incremental-test.1.bscr b/regress/win32/tests/incremental-test.1.bscr new file mode 100644 index 0000000000..9ab38bffe0 --- /dev/null +++ b/regress/win32/tests/incremental-test.1.bscr @@ -0,0 +1,9 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +label storage=File volume=TestVolume002 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-test.2.bscr b/regress/win32/tests/incremental-test.2.bscr new file mode 100644 index 0000000000..f716a022c8 --- /dev/null +++ b/regress/win32/tests/incremental-test.2.bscr @@ -0,0 +1,9 @@ +@output nul +messages +@@out@ tmp/log1.out +@# Force Incremental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=Differential job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-test.3.bscr b/regress/win32/tests/incremental-test.3.bscr new file mode 100644 index 0000000000..c4239dd0a3 --- /dev/null +++ b/regress/win32/tests/incremental-test.3.bscr @@ -0,0 +1,7 @@ +@output nul +messages +@@out@ tmp/log1.out +run level=Incremental job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-test.4.bscr b/regress/win32/tests/incremental-test.4.bscr new file mode 100644 index 0000000000..700afcb8d4 --- /dev/null +++ b/regress/win32/tests/incremental-test.4.bscr @@ -0,0 +1,7 @@ +@output nul +messages +@@out@ tmp/log1.out +run level=Differential job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/incremental-test.5.bscr b/regress/win32/tests/incremental-test.5.bscr new file mode 100644 index 0000000000..1f093f18ef --- /dev/null +++ b/regress/win32/tests/incremental-test.5.bscr @@ -0,0 +1,16 @@ +@output nul +messages +@@out@ tmp/log1.out +run level=Incremental job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@output tmp/log2.out +restore where=@topdir@/tmp/bacula-restores storage=File file=<@topdir@/tmp/restore-list +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/incremental-test.cmd b/regress/win32/tests/incremental-test.cmd new file mode 100644 index 0000000000..baf5bd3729 --- /dev/null +++ b/regress/win32/tests/incremental-test.cmd @@ -0,0 +1,91 @@ +REM +REM Run a simple backup of the Bacula build directory then create some +REM new files, do an Incremental and restore those two files. +REM +SET TestName=incremental-test +SET JobName=Incremental + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/build>${cwd}/tmp/file-list + +MKDIR tmp\build +COPY build\src\dird\*.c tmp\build >nul 2>&1 + +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +REM +REM Now create two new files to be restored later +REM +bin\bsleep 1 +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +COPY tmp\build\dird.c tmp\build\ficheriro2.txt >nul 2>&1 + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +bin\bsleep 1 +touch tmp\build\ficheriro1.txt +touch tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +bin\bsleep 1 + +COPY tmp\build\ficheriro2.txt tmp\build\1 >nul 2>&1 +sed -e "s;a;b;g" tmp\build\1 >tmp\build\ficheriro2.txt +DEL tmp\build\1 + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.4.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +bin\bsleep 1 +touch tmp\build\ficheriro1.txt +touch tmp\build\ficheriro2.txt +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +bin\bsleep 1 +touch tmp\build\ficheriro1.txt +touch tmp\build\ficheriro2.txt +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole + +bin\bsleep 1 +touch tmp\build\ficheriro1.txt +touch tmp\build\ficheriro2.txt +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +bin\bsleep 1 +touch tmp\build\ficheriro1.txt +touch tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\incremental-test.5.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +REM +REM Delete .c files because we will only restored the txt files +REM +DEL tmp\build\*.c +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/lib-tape-root b/regress/win32/tests/lib-tape-root new file mode 100644 index 0000000000..f65d28a8b1 --- /dev/null +++ b/regress/win32/tests/lib-tape-root @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Run a simple backup of the /lib directory +# then restore it. +# +cwd=`pwd` +bin/bacula stop 2>&1 >/dev/null +cd bin +./drop_bacula_tables >/dev/null 2>&1 +./make_bacula_tables >/dev/null 2>&1 +./grant_bacula_privileges 2>&1 >/dev/null +cd .. + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "/lib" >${cwd}/tmp/file-list +echo " " +echo " " +echo " === Starting lib-tape-root test ===" +echo " " +echo " " +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/nul +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== lib-tape-root failed!!! ===== " + echo " ===== lib-tape-root failed!!! ===== " >>test.out + echo " " +else + echo " ===== lib-tape-root OK ===== " + echo " ===== lib-tape-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/win32/tests/lib-test-root b/regress/win32/tests/lib-test-root new file mode 100644 index 0000000000..43b71d0b58 --- /dev/null +++ b/regress/win32/tests/lib-test-root @@ -0,0 +1,76 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +MUID=`/usr/bin/id -u` +if [ $MUID != 0 ] ; then + echo " " + echo "You must be root to run this test." + echo " ===== !!!! lib-test-root not run !!!! ===== " + echo " ===== !!!! lib-test-root not run !!!! ===== " >>test.out + echo " " + exit 1 +fi +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +echo "/lib" >${cwd}/tmp/file-list + +echo " " +echo " " +echo " === Starting /lib save/restore test ===" +echo " " +echo " " + +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-lib-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/nul +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! lib-test-root failed !!!! ===== " + echo " ===== !!!! lib-test-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== lib-test-root OK ===== " + echo " ===== lib-test-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/win32/tests/migration-job-test.cmd b/regress/win32/tests/migration-job-test.cmd new file mode 100644 index 0000000000..d851fdeea6 --- /dev/null +++ b/regress/win32/tests/migration-job-test.cmd @@ -0,0 +1,37 @@ +REM +REM Run a simple backup of the Bacula build directory then migrate it +REM to another device. +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=migration-job-test +SET JobName=MigrationJobSave + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-migration-confs +CALL scripts\prepare-two-disks +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM +REM Note, we first backup into Pool Default, +REM then Migrate into Pool Full. +REM Pool Default uses Storage=File +REM Pool Full uses Storage=DiskChanger + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\migration-job-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/migration-jobspan-test.cmd b/regress/win32/tests/migration-jobspan-test.cmd new file mode 100644 index 0000000000..e21a19aaf2 --- /dev/null +++ b/regress/win32/tests/migration-jobspan-test.cmd @@ -0,0 +1,42 @@ +REM +REM Run a simple backup of the Bacula build directory then migrate it +REM to another device. +REM +REM Test migrating a job that spans two Volumes +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=migration-jobspan-test +SET JobName=MigrationJobSpanSave + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-migration-confs +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/build >\tmp\file-list + +COPY bin\bacula-sd.conf tmp\1 +sed "s;# Maximum File Size; Maximum File Size;" %CD%\tmp\1 >%CD%\bin\bacula-sd.conf + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM +REM Note, we first backup into Pool Default, +REM then Migrate into Pool Full. +REM Pool Default uses Storage=File +REM Pool Full uses Storage=DiskChanger + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\migration-jobspan-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/migration-occupancy-test.cmd b/regress/win32/tests/migration-occupancy-test.cmd new file mode 100644 index 0000000000..d68dac563d --- /dev/null +++ b/regress/win32/tests/migration-occupancy-test.cmd @@ -0,0 +1,36 @@ +REM +REM Run a simple backup of the Bacula build directory then migrate it +REM to another device. +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=migration-occupancy-test +SET JobName=MigrationJobSave + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-migration-confs +CALL scripts\prepare-two-disks +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM +REM Note, we first backup into Pool Default, +REM then Migrate into Pool Full. +REM Pool Default uses Storage=File +REM Pool Full uses Storage=DiskChanger + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\migration-occupancy-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/migration-time-test.cmd b/regress/win32/tests/migration-time-test.cmd new file mode 100644 index 0000000000..473ebe6b5e --- /dev/null +++ b/regress/win32/tests/migration-time-test.cmd @@ -0,0 +1,37 @@ +REM +REM Run a simple backup of the Bacula build directory then migrate it +REM to another device. +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=migration-time-test +SET JobName=MigrationJobSave + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-migration-confs +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM +REM Note, we first backup into Pool Default, +REM then Migrate into Pool Full. +REM Pool Default uses Storage=File +REM Pool Full uses Storage=DiskChanger + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\migration-time-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/migration-volume-test.cmd b/regress/win32/tests/migration-volume-test.cmd new file mode 100644 index 0000000000..86505d46a6 --- /dev/null +++ b/regress/win32/tests/migration-volume-test.cmd @@ -0,0 +1,40 @@ +REM +REM Run a backup of the Bacula build directory on two Volumes +REM then migrate it to another device. +REM +REM This script uses the virtual disk autochanger +REM +SET TestName=migration-volume-test +SET JobName=MigVolBackup + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-migration-confs +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/build >\tmp\file-list + +REM COPY bin\bacula-sd.conf tmp\1 +REM sed "s;# Maximum File Size; Maximum File Size;" tmp\1 >bin\bacula-sd.conf + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM +REM Note, we first backup into Pool Default, +REM then Migrate into Pool Full. +REM Pool Default uses Storage=File +REM Pool Full uses Storage=DiskChanger + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\migration-volume-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/query-test.1.bscr b/regress/win32/tests/query-test.1.bscr new file mode 100644 index 0000000000..9ab38bffe0 --- /dev/null +++ b/regress/win32/tests/query-test.1.bscr @@ -0,0 +1,9 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +label storage=File volume=TestVolume002 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/query-test.2.bscr b/regress/win32/tests/query-test.2.bscr new file mode 100644 index 0000000000..9e1afb7dfb --- /dev/null +++ b/regress/win32/tests/query-test.2.bscr @@ -0,0 +1,9 @@ +@output nul +messages +@@out@ tmp/log1.out +@# Force differental on the second Volume +update volume=TestVolume001 VolStatus=Used +run level=differental job=@JobName@ yes +wait +messages +@output diff --git a/regress/win32/tests/query-test.3.bscr b/regress/win32/tests/query-test.3.bscr new file mode 100644 index 0000000000..266f6a4ff7 --- /dev/null +++ b/regress/win32/tests/query-test.3.bscr @@ -0,0 +1,46 @@ +@output nul +messages +@@out@ tmp/log1.out +run level=incremental job=@JobName@ yes +wait +messages +@# +@# Now do the queries +@# +query +1 +ficheriro1.txt +query +2 +@topdir@/tmp/build/ +ficheriro1.txt +localhost-fd +query +6 +TestVolume001 +query +7 +1 +query +8 +localhost-fd +query +9 +Default +query +10 +query +11 +query +12 +1 +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores storage=File file=<@topdir@/tmp/restore-list +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/query-test.cmd b/regress/win32/tests/query-test.cmd new file mode 100644 index 0000000000..d919bbea87 --- /dev/null +++ b/regress/win32/tests/query-test.cmd @@ -0,0 +1,48 @@ +REM +REM Run a simple backup of the Bacula build directory then create some +REM new files, do a Differental then a bunch of query commands +REM and finally restore the two files. +REM +SET TestName=query-test +SET JobName=query + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/build >\tmp\file-list +MKDIR tmp\build +COPY build\src\dird\*.c tmp\build >nul 2>&1 +ECHO %CD:\=/%/tmp/build/ficheriro1.txt>tmp\restore-list +ECHO %CD:\=/%/tmp/build/ficheriro2.txt>>tmp\restore-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\query-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO ficheriro1.txt >tmp\build\ficheriro1.txt +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\query-test.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO ficheriro2.txt >tmp\build\ficheriro2.txt +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\query-test.3.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +REM +REM Delete .c files because we will only restored the txt files +REM +DEL tmp\build\*.c + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/recycle-test.bscr b/regress/win32/tests/recycle-test.bscr new file mode 100644 index 0000000000..734cc7e9d3 --- /dev/null +++ b/regress/win32/tests/recycle-test.bscr @@ -0,0 +1,51 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File1 volume=TestVolume001 +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume003 +update Volume=TestVolume001 volretention=10s +update Volume=TestVolume001 maxvoljobs=1 +update Volume=TestVolume002 volretention=10s +update Volume=TestVolume002 maxvoljobs=1 +update Volume=TestVolume003 volretention=10s +update Volume=TestVolume003 maxvoljobs=1 +list volumes +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +@sleep 10 +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +run job=@JobName@ storage=File1 level=full yes +wait +messages +list volumes +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/recycle-test.cmd b/regress/win32/tests/recycle-test.cmd new file mode 100644 index 0000000000..b006fe482f --- /dev/null +++ b/regress/win32/tests/recycle-test.cmd @@ -0,0 +1,26 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM create three volumes and do six backups causing the +REM volumes to be recycled, and cycling through the volumes +REM twice. Tests maxvoljobs and volretention. +REM +SET TestName=recycle-test +SET JobName=Recycle + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\recycle-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/relabel-tape b/regress/win32/tests/relabel-tape new file mode 100644 index 0000000000..46b971a9fd --- /dev/null +++ b/regress/win32/tests/relabel-tape @@ -0,0 +1,94 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory using the compressed option +# then backup four times, each with incremental then finally restore. +# It should require at least 4 different bsrs. +# +TestName="relabel-tape" +JobName=Relabeltape +. scripts/functions +set_debug 0 + +scripts/cleanup-tape +scripts/copy-tape-confs +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full yes +wait +messages +add pool=Default +0 +TestVolume002 +@# set status to append +update volume=TestVolume001 +1 +. +run job=NightlySave level=Full yes +@sleep 20 +unmount +unmount +purge volume=TestVolume001 +relabel oldvolume=TestVolume001 volume=TestVolume003 slot=0 pool=Default +list volumes +mount +messages +wait +run job=$JobName level=Full yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 + + +echo "Backup done" +# +# now do several restores to ensure we cleanup between jobs +# +cat <tmp/bconcmds +@$out /dev/null +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +restore where=${cwd}/tmp/bacula-restores select all done +yes +wait +@$out tmp/log2.out +@# +@# now unmount the tape and start two restores +@# at the same time +@# +unmount storage=DDS-4 +restore where=${cwd}/tmp/bacula-restores select all done +yes +restore where=${cwd}/tmp/bacula-restores select +unmark * +mark * +done +yes +mount storage=DDS-4 +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole + +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/restore-by-file-tape b/regress/win32/tests/restore-by-file-tape new file mode 100644 index 0000000000..adc01c421f --- /dev/null +++ b/regress/win32/tests/restore-by-file-tape @@ -0,0 +1,101 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where the maximum tape file size is set to 1M +# then restore a few files from it. Note, by setting the maximum +# file size to 1M, it runs very slow. There are about 64 files that +# are created during each of the two backups. +# +TestName="restore-by-file-tape" +JobName=restorebyfile +. scripts/functions +set_debug 0 +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list +sed s%\^%${cwd}% ${cwd}/scripts/flist >${cwd}/tmp/restore2-list + +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +run job=$JobName level=Full yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 file=<${cwd}/tmp/restore2-list +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +dstat=0 +# +# We need to stop and start Bacula to +# test appending to a previously written tape +# +for i in `cat ${cwd}/tmp/restore2-list`; do + diff $i ${cwd}/tmp/bacula-restores$i + if [ $? != 0 ] ; then + dstat=1 + fi +done + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +run job=$JobName level=Full yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores +7 +<${cwd}/tmp/restore2-list + +yes +wait +messages +@output +quit +END_OF_DATA + +# +# Bacula was stopped, but we must restart it to +# test appending to a previously written tape +# +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs + +scripts/check_for_zombie_jobs storage=DDS-4 +bin/bacula stop 2>&1 >/dev/null +for i in `cat ${cwd}/tmp/restore2-list`; do + diff $i ${cwd}/tmp/bacula-restores$i + if [ $? != 0 ] ; then + dstat=1 + fi +done + +end_test diff --git a/regress/win32/tests/restore-by-file-test.bscr b/regress/win32/tests/restore-by-file-test.bscr new file mode 100644 index 0000000000..ad4053aed4 --- /dev/null +++ b/regress/win32/tests/restore-by-file-test.bscr @@ -0,0 +1,20 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores storage=File +7 +<@topdir@/tmp/restore-list + +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/restore-by-file-test.cmd b/regress/win32/tests/restore-by-file-test.cmd new file mode 100644 index 0000000000..669196648a --- /dev/null +++ b/regress/win32/tests/restore-by-file-test.cmd @@ -0,0 +1,30 @@ +REM +REM Run a simple backup of the Bacula build directory using the compressed option +REM then restore it. +REM + +SET TestName=restore-by-file-test +SET JobName=restorebyfile + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/build >\tmp\file-list +MKDIR tmp\build +COPY build\src\dird\*.c tmp\build >nul 2>&1 +DIR /b tmp\build >tmp\1 +sed -e "s;^;%CD:\=/%/tmp/build/;" tmp\1 >tmp\restore-list +DEL tmp\1 + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\restore-by-file-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/restore-disk-seek-test.bscr b/regress/win32/tests/restore-disk-seek-test.bscr new file mode 100644 index 0000000000..a6f4ef68a6 --- /dev/null +++ b/regress/win32/tests/restore-disk-seek-test.bscr @@ -0,0 +1,23 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +sql +select * from JobMedia; + +restore bootstrap=@topdir@/tmp/rbn.bsr where=@topdir@/tmp/bacula-restores storage=File +7 +<@topdir@/tmp/restore-list + +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/restore-disk-seek-test.cmd b/regress/win32/tests/restore-disk-seek-test.cmd new file mode 100644 index 0000000000..6fdfdbd60f --- /dev/null +++ b/regress/win32/tests/restore-disk-seek-test.cmd @@ -0,0 +1,55 @@ +REM +REM Run a backup of the full bacula build directory, but with the +REM Maximum File Size set. Then do a restore of a few files to kick in +REM disk seeking (not yet enabled), and ensure that the restored files +REM match. Even though disk seeking is not yet enabled, this is a good test, +REM and once it is enabled, this will test it. +REM +SET TestName=restore-disk-seek-test +SET JobName=restore-disk-seek + +CALL scripts\functions set_debug 1 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/tmp/build >\tmp\file-list + +IF EXIST tmp\build RD /s /q tmp\build +MKDIR tmp\build + +REM Copy only the .c files (to be restored) +REM set files to "*.c" for all c files +SET files=ua_tree.c ua_update.c +REM SET files=*.c +FOR %%i in ( %files% ) DO COPY build\src\dird\%%i tmp\build >nul 2>&1 +DIR /b tmp\build >tmp\1 +sed -e "s;^;%CD:\=/%/tmp/build/;" tmp\1 >tmp\restore-list + +REM At this point restore-list contains the list +REM of files we will restore +DEL tmp\1 + +REM Now backup *everything* +IF EXIST tmp\build RD /s /q tmp\build +MKDIR tmp\build +COPY build\src\dird\* tmp\build >nul 2>&1 +REM Enable MaximumFileSize +COPY bin\bacula-sd.conf tmp\1 >nul 2>&1 +sed "s;# Maximum File Size; Maximum File Size;" tmp\1 >bin\bacula-sd.conf + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\restore-disk-seek-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +REM Now setup a control directory of only what we *should* restore +RD /s /q tmp\build +MKDIR tmp\build +FOR %%i in ( %files% ) DO COPY build\src\dird\%%i tmp\build >nul 2>&1 + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_tmp_build_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/restore2-by-file-test.bscr b/regress/win32/tests/restore2-by-file-test.bscr new file mode 100644 index 0000000000..12d2d8fd4b --- /dev/null +++ b/regress/win32/tests/restore2-by-file-test.bscr @@ -0,0 +1,17 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores storage=File file=<@topdir@/tmp/restore2-list +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/restore2-by-file-test.cmd b/regress/win32/tests/restore2-by-file-test.cmd new file mode 100644 index 0000000000..cba7ea35b1 --- /dev/null +++ b/regress/win32/tests/restore2-by-file-test.cmd @@ -0,0 +1,31 @@ +REM +REM Run a simple backup of the Bacula build directory using the compressed option +REM then restore a few selected files. +REM +SETLOCAL ENABLEDELAYEDEXPANSION +SET TestName=restore2-by-file-test +SET JobName=restore2byfile + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list +sed -e "s;^;%CD:\=/%;" scripts/flist >tmp\restore2-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\restore2-by-file-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +SET dstat=0 +FOR /f %%i IN ( tmp\restore2-list ) DO ( + SET SUBDIR=%%i + diff %%i tmp/bacula-restores/!SUBDIR::=! + IF %ERRORLEVEL% NEQ 0 SET dstat=1 +) +CALL scripts\functions end_test diff --git a/regress/win32/tests/runscript-test b/regress/win32/tests/runscript-test new file mode 100644 index 0000000000..ef3c8b8d10 --- /dev/null +++ b/regress/win32/tests/runscript-test @@ -0,0 +1,90 @@ +#!/bin/sh +# +# Test if Bacula can automatically create a Volume label. +# + +TestName="runscript-test" + +. scripts/functions +set_debug 0 +copy_test_confs + +rm -f bin/bacula-dir.conf +/bin/cp -f scripts/bacula-dir.conf.testrunscript bin/bacula-dir.conf + +echo "${cwd}/build" >${cwd}/tmp/file-list + +start_test + +cat <${cwd}/tmp/bconcmds +@output /dev/null +messages +label volume=TestVolume001 +@#setdebug level=100 storage=File +@output ${cwd}/tmp/log.RUN2.out +run job=RUN_FD_WARNING yes +wait +@sleep 5 +messages +run job=RUN_ALL_OK yes +wait +@sleep 5 +messages +run job=RUN_FD_FAILED yes +wait +@sleep 5 +messages +run job=RUN_DIR_FAILED yes +wait +@sleep 5 +messages +st dir +quit +END_OF_DATA + + +bin/bacula start +cat ${cwd}/tmp/bconcmds | bin/bconsole -c bin/bconsole.conf &> ${cwd}/tmp/log.RUN1.out + +stop_bacula + +if grep -q 'dir: BeforeJob: run command "/bin/echo RunBeforeJob"' ${cwd}/tmp/log.RUN1.out && + grep -q 'fd: ClientRunBeforeJob: ClientRunBeforeJob' ${cwd}/tmp/log.RUN1.out && + grep -q 'fd: ClientAfterJob: run command "/bin/echo ClientRunAfterJob' ${cwd}/tmp/log.RUN1.out && + grep -q 'dir: AfterJob: run command "/bin/echo RunAfterJob' ${cwd}/tmp/log.RUN1.out +then + [ "$debug" -eq 1 ] && echo RUN_ALL_OK ok +else + echo "RUN_ALL_OK in error" + rstat=1 +fi + +if grep -q 'dir: BeforeJob: run command "/bin/false RUN_DIR_FAILED"' ${cwd}/tmp/log.RUN1.out && + grep -q 'dir: BeforeJob: RunAfterFailedJob' ${cwd}/tmp/log.RUN1.out && + true # grep -q 'Backup OK -- with warnings' ${cwd}/tmp/log.RUN1.out +then + [ "$debug" -eq 1 ] && echo RUN_DIR_FAILED ok +else + echo "RUN_DIR_FAILED in error" + rstat=1 +fi + +if grep -q 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED1"' ${cwd}/tmp/log.RUN1.out && + grep -q 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_FAILED2"' ${cwd}/tmp/log.RUN1.out && + grep -q 'dir: AfterJob: run command "/bin/echo RunAfterFailedJob"' ${cwd}/tmp/log.RUN1.out +then + [ "$debug" -eq 1 ] && echo RUN_FD_FAILED ok +else + echo "RUN_FD_FAILED in error" + rstat=1 +fi + +if grep -q 'fd: ClientBeforeJob: run command "/bin/false RUN_FD_WARNING"' ${cwd}/tmp/log.RUN1.out && + grep -q 'Backup OK -- with warnings' ${cwd}/tmp/log.RUN1.out +then + [ "$debug" -eq 1 ] && echo RUN_FD_WARNING ok +else + echo "RUN_FD_WARNING in error" + rstat=1 +fi + diff --git a/regress/win32/tests/scratch-pool-test.bscr b/regress/win32/tests/scratch-pool-test.bscr new file mode 100644 index 0000000000..9170fb7c60 --- /dev/null +++ b/regress/win32/tests/scratch-pool-test.bscr @@ -0,0 +1,25 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Scratch drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Scratch drive=0 +update Volume=TestVolume001 MaxVolBytes=2000000 pool=Scratch drive=0 +update Volume=TestVolume001 inchanger=no pool=Scratch drive=0 +@#setdebug level=200 storage=DDS-4 +llist volume=TestVolume001 +llist volume=TestVolume002 +run job=@JobName@ yes +wait +messages +list volumes +llist volume=TestVolume001 +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/scratch-pool-test.cmd b/regress/win32/tests/scratch-pool-test.cmd new file mode 100644 index 0000000000..d8e88f400c --- /dev/null +++ b/regress/win32/tests/scratch-pool-test.cmd @@ -0,0 +1,45 @@ +REM +REM Run a simple backup of the Bacula build directory +REM to two tapes where the maximum tape file size is set to 1M +REM Note, this test simulates the tape filling and writing to +REM the next tape. One minor wrinkle: we create the two tapes +REM in the Scratch pool, so they should be switched to the Default +REM Pool automatically. +REM We set TestVolume001 to not in the changer, so the algorithm +REM should find TestVolume002 and use it rather than blocking. +REM +REM Note we use the viritual disk autochanger +REM +SET TestName=scratch-pool-test +SET JobName=scratch-pool + +CALL scripts\functions set_debug 0 + +CALL config_out +IF "%AUTOCHANGER%" == "nul" ( + ECHO two-volume-test skipped. No autochanger. + EXIT /b 1 +) + +CALL scripts\cleanup +CALL scripts\copy-2disk-confs >nul 2>&1 +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/build >\tmp\file-list + +COPY bin\bacula-sd.conf tmp\1 >nul 2>&1 +sed -e "s;# Maximum File Size; Maximum File Size;g" tmp\1 >bin\bacula-sd.conf + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\scratch-pool-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/six-vol-test.bscr b/regress/win32/tests/six-vol-test.bscr new file mode 100644 index 0000000000..e6698df335 --- /dev/null +++ b/regress/win32/tests/six-vol-test.bscr @@ -0,0 +1,19 @@ +@output nul +messages +@@out@ tmp/log1.out +run job=@JobName@ storage=File yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/six-vol-test.cmd b/regress/win32/tests/six-vol-test.cmd new file mode 100644 index 0000000000..ab3ca0559b --- /dev/null +++ b/regress/win32/tests/six-vol-test.cmd @@ -0,0 +1,36 @@ +REM +REM Create a 60MB file with random bytes. Back it up to 6 Volumes +REM each constrained to 10MB using the automatic labeling feature. +REM +SET TestName=six-vol-test +SET JobName=SixVol + +CALL scripts\functions set_debug 0 + +CALL scripts\cleanup +CALL scripts\copy-testa-confs >nul 2>&1 +ECHO %CD:\=/%/tmp/largefile >\tmp\file-list + +ECHO Creating a 60MB file with bacula-dir data ... +tools\dd if=bin/bacula-dir.exe of=%CD:\=/%/tmp/1 bs=1024 count=500 >nul 2>&1 +COPY /b %CD%\tmp\1+%CD%\tmp\1+%CD%\tmp\1+%CD%\tmp\1+%CD%\tmp\1 %CD%\tmp\2 >nul 2>&1 +DEL %CD%\tmp\1 +COPY /b %CD%\tmp\2+%CD%\tmp\2 %CD%\tmp\3 >nul 2>&1 +DEL %CD%\tmp\2 +COPY /b %CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3 %CD%\tmp\4 >nul 2>&1 +COPY /b %CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\3+%CD%\tmp\4 %CD%\tmp\largefile >nul 2>&1 +DEL %CD%\tmp\3 %CD%\tmp\4 + +CALL scripts\functions change_jobname MultiVol %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\six-vol-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +diff tmp\largefile tmp\bacula-restores\%CD::=%\tmp\largefile >nul 2>&1 +SET dstat=%ERRORLEVEL% +CALL scripts\functions end_test diff --git a/regress/win32/tests/small-file-size-tape b/regress/win32/tests/small-file-size-tape new file mode 100644 index 0000000000..14516b3bbb --- /dev/null +++ b/regress/win32/tests/small-file-size-tape @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape where the maximum tape file size is set to 1M +# +TestName="small-file-size-tape" +JobName=smallfilesize +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list +cp ${cwd}/bin/bacula-sd.conf ${cwd}/tmp/1 +sed "s%# Maximum File Size% Maximum File Size%" ${cwd}/tmp/1 >${cwd}/bin/bacula-sd.conf + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +setdebug level=2 storage=DDS-4 +run job=$JobName yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=DDS-4 +unmark * +mark * +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/span-vol-test.bscr b/regress/win32/tests/span-vol-test.bscr new file mode 100644 index 0000000000..6ec7c37eae --- /dev/null +++ b/regress/win32/tests/span-vol-test.bscr @@ -0,0 +1,27 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File1 volume=TestVolume004 +label storage=File1 volume=TestVolume003 +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume001 +update Volume=TestVolume004 MaxVolBytes=3000000 +update Volume=TestVolume003 MaxVolBytes=3000000 +update Volume=TestVolume002 MaxVolBytes=3000000 +run job=@JobName@ storage=File1 yes +wait +list volumes +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File1 +unmark * +mark * +done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/span-vol-test.cmd b/regress/win32/tests/span-vol-test.cmd new file mode 100644 index 0000000000..52cbaffb77 --- /dev/null +++ b/regress/win32/tests/span-vol-test.cmd @@ -0,0 +1,26 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM split the archive into four volumes, two of which are +REM totally full. I.e. make sure that bsr selects all tapes +REM including those fully spanned. +REM +SET TestName=span-vol-test +SET JobName=SpanVol + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\span-vol-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/sparse-compressed-test.bscr b/regress/win32/tests/sparse-compressed-test.bscr new file mode 100644 index 0000000000..e4d1040296 --- /dev/null +++ b/regress/win32/tests/sparse-compressed-test.bscr @@ -0,0 +1,17 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=SparseCompressedTest yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=File done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/sparse-compressed-test.cmd b/regress/win32/tests/sparse-compressed-test.cmd new file mode 100644 index 0000000000..e8b701dcf1 --- /dev/null +++ b/regress/win32/tests/sparse-compressed-test.cmd @@ -0,0 +1,23 @@ +REM +REM Run a simple backup of the Bacula build directory using the Sparse option +REM then restore it. +REM +SET TestName=sparse-compressed-test +SET JobName=Sparse-conpressed + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\sparse-compressed-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/sparse-test.bscr b/regress/win32/tests/sparse-test.bscr new file mode 100644 index 0000000000..b7438e9dfb --- /dev/null +++ b/regress/win32/tests/sparse-test.bscr @@ -0,0 +1,20 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/sparse-test.cmd b/regress/win32/tests/sparse-test.cmd new file mode 100644 index 0000000000..a8ba5d1680 --- /dev/null +++ b/regress/win32/tests/sparse-test.cmd @@ -0,0 +1,23 @@ +REM +REM Run a simple backup of the Bacula build directory using the Sparse option +REM then restore it. +REM +SET TestName=sparse-test +SET JobName=SparseTest + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\sparse-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/test0.cmd b/regress/win32/tests/test0.cmd new file mode 100644 index 0000000000..e1824b12b7 --- /dev/null +++ b/regress/win32/tests/test0.cmd @@ -0,0 +1,2 @@ +COPY nul test.out >nul 2>&1 +DEL bin\working\* 2>&1 diff --git a/regress/win32/tests/truncate-bug-tape b/regress/win32/tests/truncate-bug-tape new file mode 100644 index 0000000000..1b47d9e137 --- /dev/null +++ b/regress/win32/tests/truncate-bug-tape @@ -0,0 +1,87 @@ +#!/bin/sh +# +# Test for a tape truncation bug. +# +TestName="truncate-bug-tape" +JobName=truncatebug +. scripts/functions + +set_debug 0 +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default +@# do a bunch of saves so we have 12 files on the tape +run job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +run level=Full job=$JobName yes +@#setdebug level=100 storage=DDS-4 +wait +messages +quit +END_OF_DATA + +run_bacula +scripts/check_for_zombie_jobs storage=DDS-4 + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log2.out +@# +@# now do a restore +@# +restore where=${cwd}/tmp/bacula-restores storage=DDS-4 +3 +@# select JobId=4 (i.e. file five on the tape) +4 +cd ${cwd}/build +@# mark a single file +mark configure +done +yes +wait +messages +@output +quit +END_OF_DATA + +run_bconsole +scripts/check_for_zombie_jobs storage=DDS-4 + +# Now write to tape one more time +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log3.out +run level=Full job=$JobName yes +wait +messages +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +grep "^ Termination: *Backup OK" tmp/log3.out 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/win32/tests/two-jobs-test.1.bscr b/regress/win32/tests/two-jobs-test.1.bscr new file mode 100644 index 0000000000..745a2e1011 --- /dev/null +++ b/regress/win32/tests/two-jobs-test.1.bscr @@ -0,0 +1,14 @@ +setdebug level=15 storage=File +@output nul +messages +@output nul +estimate job=@JobName@ listing +estimate job=@JobName@ listing +estimate job=@JobName@ listing +messages +@@out@ tmp/log1.out +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/two-jobs-test.2.bscr b/regress/win32/tests/two-jobs-test.2.bscr new file mode 100644 index 0000000000..144ac5f997 --- /dev/null +++ b/regress/win32/tests/two-jobs-test.2.bscr @@ -0,0 +1,27 @@ +@output nul +messages +@@out@ tmp/log1.out +run job=@JobName@ +yes +wait +messages +@# +@# now do several restores to ensure we cleanup between jobs +@# +@output nul +restore where=@topdir@/tmp/bacula-restores select all storage=File done +yes +wait +restore where=@topdir@/tmp/bacula-restores select all storage=File done +yes +wait +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@output +quit diff --git a/regress/win32/tests/two-jobs-test.cmd b/regress/win32/tests/two-jobs-test.cmd new file mode 100644 index 0000000000..3964e90d16 --- /dev/null +++ b/regress/win32/tests/two-jobs-test.cmd @@ -0,0 +1,35 @@ +REM +REM Run a simple backup of the Bacula build directory using the compressed option +REM then backup a second time and finally restore it +REM +SET TestName=two-jobs-test +SET JobName=Two-Jobs + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname CompressedTest %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-jobs-test.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File + +ECHO Backup 1 done +tools\touch build\src\dird\*.c + +REM +REM run a second job +REM +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-jobs-test.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bconsole +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/two-pool-tape b/regress/win32/tests/two-pool-tape new file mode 100644 index 0000000000..18fba8b087 --- /dev/null +++ b/regress/win32/tests/two-pool-tape @@ -0,0 +1,82 @@ +#!/bin/sh +# +# This is Arno's test. It uses two pools, two tapes, and +# an autochanger. Note, the Director has three Pools in its +# conf: Default, Full, and Inc. Default is used in the +# NightlySave job by default. What is backed up is what +# is in ${cwd}/tmp/file-list, which is by default the Bacula +# source code (i.e. the build directory). +# +TestName="two-pool-tape" +JobName=twopooltape +. scripts/functions +set_debug 0 + +. config.out +if test x${AUTOCHANGER} = x/dev/null ; then + echo "two-pool-tape test skipped. No autochanger." + exit +fi + +scripts/cleanup +scripts/copy-2tape-confs +echo "Prepare two tapes" +scripts/prepare-two-tapes +echo "Done prepare two tapes" + +# Make a relatively large backup set 5 x source code directory +echo "${cwd}/build" >${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list +echo "${cwd}/build" >>${cwd}/tmp/file-list + +start_test + +# Write out bconsole commands to a file +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +list volumes +@# Start job with Client run before and sleep +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +@# wait between starting jobs +@sleep 60 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +@sleep 10 +messages +@sleep 10 +messages +@sleep 10 +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +check_restore_diff +end_test diff --git a/regress/win32/tests/two-pool-test.bscr b/regress/win32/tests/two-pool-test.bscr new file mode 100644 index 0000000000..57b3903e6a --- /dev/null +++ b/regress/win32/tests/two-pool-test.bscr @@ -0,0 +1,36 @@ +@output nul +messages +@@out@ tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Full drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +list volumes +@# Start job with Client run before and sleep +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +run job=NightlySave1 level=Full pool=Default yes +@# wait between starting jobs +@sleep 60 +@#setdebug level=100 storage=DDS-4 +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +run job=NightlySave2 level=Full pool=Full yes +@sleep 10 +messages +@sleep 10 +messages +@sleep 10 +status storage=DDS-4 +messages +wait +list volumes +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/two-pool-test.cmd b/regress/win32/tests/two-pool-test.cmd new file mode 100644 index 0000000000..2bf0028546 --- /dev/null +++ b/regress/win32/tests/two-pool-test.cmd @@ -0,0 +1,37 @@ +REM +REM This is Arno's test. It uses two pools, two tapes, and +REM an autochanger. Note, the Director has three Pools in its +REM conf: Default, Full, and Inc. Default is used in the +REM NightlySave job by default. What is backed up is what +REM is in ${cwd}/tmp/file-list, which is by default the Bacula +REM source code (i.e. the build directory). +REM +REM Note, we use the virtual disk autochanger. +REM +SET TestName=two-pool-test +SET JobName=Two-pool + +CALL scripts\functions set_debug 0 + +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-2disk-confs >nul 2>&1 +CALL scripts\prepare-two-disks + +REM Make a relatively large backup set 5 x source code directory +REM Reduced to 1 for portable +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions start_test + +REM Write out bconsole commands to a file +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-pool-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/two-vol-test.bscr b/regress/win32/tests/two-vol-test.bscr new file mode 100644 index 0000000000..8de06c5d64 --- /dev/null +++ b/regress/win32/tests/two-vol-test.bscr @@ -0,0 +1,19 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=File1 volume=TestVolume002 +label storage=File1 volume=TestVolume001 +update Volume=TestVolume002 MaxVolBytes=3000000 +run job=@JobName@ storage=File1 yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=File1 done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/two-vol-test.cmd b/regress/win32/tests/two-vol-test.cmd new file mode 100644 index 0000000000..ce59794572 --- /dev/null +++ b/regress/win32/tests/two-vol-test.cmd @@ -0,0 +1,24 @@ +REM +REM Run a simple backup of the Bacula build directory but +REM split the archive into two volumes +REM +SET TestName=two-vol-test +SET JobName=TwoVol + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-vol-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=File1 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/two-volume-tape.1.bscr b/regress/win32/tests/two-volume-tape.1.bscr new file mode 100644 index 0000000000..30ebdf96bf --- /dev/null +++ b/regress/win32/tests/two-volume-tape.1.bscr @@ -0,0 +1,11 @@ +@@out@ nul +messages +@@out@ @topdir@/tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0 +@#setdebug level=1000 client +run job=@JobName@ yes +wait +messages +quit diff --git a/regress/win32/tests/two-volume-tape.2.bscr b/regress/win32/tests/two-volume-tape.2.bscr new file mode 100644 index 0000000000..6af471c6b7 --- /dev/null +++ b/regress/win32/tests/two-volume-tape.2.bscr @@ -0,0 +1,12 @@ +@@out@ nul +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/two-volume-tape.cmd b/regress/win32/tests/two-volume-tape.cmd new file mode 100644 index 0000000000..62e80ecaa9 --- /dev/null +++ b/regress/win32/tests/two-volume-tape.cmd @@ -0,0 +1,48 @@ +REM +REM Run a simple backup of the Bacula build directory +REM to two tapes where the maximum tape file size is set to 1M +REM Note, this test simulates the tape filling and writing to +REM the next tape. +REM +SET TestName=two-volume-tape +SET JobName=twovoltape +CALL scripts\functions set_debug 0 + +CALL config_out +IF "%AUTOCHANGER%" == "nul" ( + ECHO two-volume-tape test skipped. No autochanger. + EXIT /b 1 +) + +CALL scripts\cleanup +CALL scripts\copy-2tape-confs +CALL scripts\prepare-two-tapes + +ECHO %CD:\=/%/build >\tmp\file-list + +COPY bin\bacula-sd.conf tmp\1 +sed -e "s%# Maximum File Size% Maximum File Size%g" >bin\bacula-sd.conf + +CALL scripts\functions change_jobname %JobName% +CALL scripts\functions start_test + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-volume-tape.1.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +mt -f %TAPE_DRIVE% rewind +mtx -f %AUTOCHANGER% unload +bin\bsleep 15 + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-volume-tape.2.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/two-volume-test.bscr b/regress/win32/tests/two-volume-test.bscr new file mode 100644 index 0000000000..bd08ef35e1 --- /dev/null +++ b/regress/win32/tests/two-volume-test.bscr @@ -0,0 +1,21 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=1 pool=Default drive=0 +label storage=DDS-4 volume=TestVolume002 slot=2 pool=Default drive=0 +update Volume=TestVolume001 MaxVolBytes=3000000 pool=Default drive=0 +@#setdebug level=1000 client +run job=@JobName@ yes +wait +messages +@# +@# now do a restore +@# +@@out@ tmp/log2.out +restore where=@topdir@/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +@@out@ +quit + diff --git a/regress/win32/tests/two-volume-test.cmd b/regress/win32/tests/two-volume-test.cmd new file mode 100644 index 0000000000..9bfe9c88da --- /dev/null +++ b/regress/win32/tests/two-volume-test.cmd @@ -0,0 +1,35 @@ +REM +REM Run a simple backup of the Bacula build directory +REM to two tapes where the maximum tape file size is set to 1M +REM Note, this test simulates the tape filling and writing to +REM the next tape. +REM +REM Note we use the viritual disk autochanger +REM +SET TestName=two-volume-test +SET JobName=TwoVolume +CALL scripts\functions set_debug 1 +CALL config_out + +CALL scripts\cleanup +CALL scripts\copy-2disk-confs >nul 2>&1 +CALL scripts\prepare-two-disks + +ECHO %CD:\=/%/build >\tmp\file-list + +COPY bin\bacula-sd.conf tmp\1 +sed -e "s;# Maximum File Size; Maximum File Size;g" tmp\1 >bin\bacula-sd.conf + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +REM Write out bconsole commands +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\two-volume-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula +CALL scripts\functions check_for_zombie_jobs storage=DDS-4 +CALL scripts\functions stop_bacula + +CALL scripts\functions check_two_logs +CALL scripts\functions check_restore_diff +CALL scripts\functions end_test diff --git a/regress/win32/tests/usr-tape-root b/regress/win32/tests/usr-tape-root new file mode 100644 index 0000000000..d888ca2324 --- /dev/null +++ b/regress/win32/tests/usr-tape-root @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Run a simple backup of the /usr directory +# then restore it. +# +cwd=`pwd` +scripts/copy-tape-confs +scripts/cleanup-tape +echo "/usr" >${cwd}/tmp/file-list + +echo " " +echo " " +echo " === Starting usr-tape-root test ===" +echo " " +echo " " + +bin/bacula start 2>&1 >/dev/null +bin/bconsole -c bin/bconsole.conf <&1 >/dev/null +cd / +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/original +cd ${cwd}/tmp/bacula-restores +${cwd}/bin/testls -e ${cwd}/scripts/exclude-usr-test lib >${cwd}/tmp/restored +cd ${cwd}/tmp +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% original >1 +sort <1 >original +# +sed s%.*lib/kbd/consolefonts$%lib/kbd/consolefonts% restored >1 +sort <1 >restored +rm -f 1 +# +cd ${cwd} +diff tmp/original tmp/restored 2>&1 1>/dev/nul +if [ $? != 0 ] ; then + echo " " + echo " " + echo " ===== !!!! usr-tape-root failed !!!! ===== " + echo " ===== !!!! usr-tape-root failed !!!! ===== " >>test.out + echo " " +else + echo " ===== usr-tape-root OK ===== " + echo " ===== usr-tape-root OK ===== " >>test.out + scripts/cleanup +fi diff --git a/regress/win32/tests/verify-vol-tape b/regress/win32/tests/verify-vol-tape new file mode 100644 index 0000000000..b9f5a24b0a --- /dev/null +++ b/regress/win32/tests/verify-vol-tape @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then verify the catalog. +# +TestName="verify-vol-tape" +JobName=VerifyVol +. scripts/functions +set_debug 0 + +copy_tape_confs + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +setdebug level=1 storage=DDS-4 sd +label storage=DDS-4 volume=TestVolume001 pool=Default +run job=$JobName yes +wait +messages +@# +@# now do a verify volume +@# +@$out ${cwd}/tmp/original +run job=VerifyTape pool=Default +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula + +sleep 2 +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +grep "^ Termination: *Backup OK" tmp/log1.out 2>&1 >/dev/null +bstat=$? +grep "^ Termination: *Verify OK" ${cwd}/tmp/original 2>&1 >/dev/null +rstat=$? +dstat=0 +end_test diff --git a/regress/win32/tests/verify-vol-test.bscr b/regress/win32/tests/verify-vol-test.bscr new file mode 100644 index 0000000000..8c73bbc59f --- /dev/null +++ b/regress/win32/tests/verify-vol-test.bscr @@ -0,0 +1,18 @@ +@@out@ nul +messages +@@out@ tmp/log1.out +setdebug level=1 storage=File sd +label storage=File volume=TestVolume001 +run job=@JobName@ yes +wait +messages +@# +@# now do a verify volume +@# +@@out@ @topdir@/tmp/original +run job=VerifyVolume +yes +wait +messages +@@out@ +quit diff --git a/regress/win32/tests/verify-vol-test.cmd b/regress/win32/tests/verify-vol-test.cmd new file mode 100644 index 0000000000..377fb3428f --- /dev/null +++ b/regress/win32/tests/verify-vol-test.cmd @@ -0,0 +1,29 @@ +REM +REM Run a simple backup of the Bacula build directory +REM then verify the catalog. +REM +SET TestName=verify-vol-test +SET JobName=VerifyVol + +CALL scripts\functions set_debug 0 +CALL scripts\functions copy_test_confs + +ECHO %CD:\=/%/build >\tmp\file-list + +CALL scripts\functions change_jobname NightlySave %JobName% +CALL scripts\functions start_test + +sed -e "s;@JobName@;%JobName%;g" -e "s;@out@;%out%;g" -e "s;@topdir@;%CD:\=/%;g" tests\verify-vol-test.bscr >tmp\bconcmds + +CALL scripts\functions run_bacula + +bin\bsleep 2 +CALL scripts\functions check_for_zombie_jobs storage=File +CALL scripts\functions stop_bacula + +grep "^ Termination: *Backup OK" tmp\log1.out 2>&1 >nul +SET bstat=%ERRORLEVEL% +grep "^ Termination: *Verify OK" tmp\original 2>&1 >nul +SET rstat=%ERRORLEVEL% +SET dstat=0 +CALL scripts\functions end_test diff --git a/regress/win32/tests/weird-files-test b/regress/win32/tests/weird-files-test new file mode 100644 index 0000000000..7a6cff9ea4 --- /dev/null +++ b/regress/win32/tests/weird-files-test @@ -0,0 +1,69 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="weird-files-test" +JobName=wierd-files +. scripts/functions +set_debug 0 + +if test ! -d weird-files ; then + echo " " + echo "Weird files not configured. Test not run." + exit 0 +fi + +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +change_jobname NightlySave $JobName +# +# Note, we save the weird-files directory twice on purpose +# because this causes problems with hard linked files +# that are only saved once. In 1.33, Bacula now deals +# with this situation. +# +echo "${cwd}/weird-files" >${cwd}/tmp/file-list +echo "${cwd}/weird-files" >>${cwd}/tmp/file-list + +start_test + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File +TestVolume001 +run job=$JobName +yes +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select storage=File +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +stop_bacula + +${cwd}/bin/testls weird-files | sort >${cwd}/tmp/original +cd tmp/bacula-restores${cwd} +${cwd}/bin/testls weird-files | sort >${cwd}/tmp/restored +cd ${cwd} + +check_two_logs +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null +dstat=$? +end_test diff --git a/regress/win32/tests/weird-files2-test b/regress/win32/tests/weird-files2-test new file mode 100644 index 0000000000..56495ee98e --- /dev/null +++ b/regress/win32/tests/weird-files2-test @@ -0,0 +1,80 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# then restore it. +# +TestName="weird-files2-test" +JobName=weird-files2 +. scripts/functions +set_debug 0 + +if test ! -d weird-files ; then + echo " " + echo "weird files not configured. Test not run." + exit 0 +fi +cwd=`pwd` +scripts/cleanup +scripts/copy-test-confs +rm -rf weird-files2 +cp -Rp weird-files weird-files2 +echo "${cwd}/weird-files2" >${cwd}/tmp/file-list + +change_jobname NightlySave $JobName +start_test + +bin/testls weird-files2 >${cwd}/tmp/original + +cat <tmp/bconcmds +@$out /dev/null +messages +@$out tmp/log1.out +label storage=File volume=TestVolume001 +run job=$JobName yes +wait +messages +@$out +quit +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=File +# +# Now mess up the a hard link, and a soft link +# +cd weird-files2 +rm -f hard-file2 +ln hard-file3 hard-file2 +rm -f soft-file2 +ln -s soft-file3 soft-file2 +cd ${cwd} +cat <tmp/bconcmds +@$out /dev/null +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where= storage=File +5 +unmark * +mark * +done +yes +wait +messages +@$out +quit +END_OF_DATA + +run_bconsole +check_for_zombie_jobs storage=File +stop_bacula + +bin/testls weird-files2 >${cwd}/tmp/restored + +check_two_logs +diff ${cwd}/tmp/original ${cwd}/tmp/restored 2>&1 >/dev/null +dstat=$? + +end_test diff --git a/regress/win32/tests/win32-backup-tape b/regress/win32/tests/win32-backup-tape new file mode 100644 index 0000000000..55d780e82e --- /dev/null +++ b/regress/win32/tests/win32-backup-tape @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="win32-backup-tape" +JobName=win32tape +. scripts/functions +set_debug 0 + +scripts/copy-win32-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_jobname $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0 +run job=$JobName yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores select all storage=DDS-4 done +yes +wait +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# no diff for now +dstat=0 +end_test diff --git a/regress/win32/tests/win32-to-linux-tape b/regress/win32/tests/win32-to-linux-tape new file mode 100644 index 0000000000..751ec733f1 --- /dev/null +++ b/regress/win32/tests/win32-to-linux-tape @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Run a simple backup of the Bacula build directory +# to a tape then restore it, we do that twice to ensure that +# we can correctly append to a tape. +# +TestName="win32-to-linux-tape" +JobName=AutoLabel +. scripts/functions +set_debug 1 + +scripts/copy-win32-confs +scripts/cleanup-tape + +echo "${cwd}/build" >${cwd}/tmp/file-list + +change_job $JobName +start_test + +cat <tmp/bconcmds +@output /dev/null +messages +@$out tmp/log1.out +label storage=DDS-4 volume=TestVolume001 slot=0 pool=Default drive=0 +run job=NightlySave yes +@sleep 10 +status storage=DDS-4 +@sleep 30 +messages +wait +messages +@# +@# now do a restore +@# +@$out tmp/log2.out +restore where=${cwd}/tmp/bacula-restores client=Tibs select all storage=DDS-4 done +yes +wait +messages +END_OF_DATA + +run_bacula +check_for_zombie_jobs storage=DDS-4 +stop_bacula + +check_two_logs +# No diff for the moment +dstat=0 +end_test -- 2.39.2