⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amanda_changer.pl

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 PL
字号:
# Copyright (c) 2006 Zmanda Inc.  All Rights Reserved.## This program is free software; you can redistribute it and/or modify it# under the terms of the GNU General Public License version 2 as published# by the Free Software Foundation.## This program is distributed in the hope that it will be useful, but# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License# for more details.## You should have received a copy of the GNU General Public License along# with this program; if not, write to the Free Software Foundation, Inc.,# 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA## Contact information: Zmanda Inc, 505 N Mathlida Ave, Suite 120# Sunnyvale, CA 94085, USA, or: http://www.zmanda.comuse Test::More qw(no_plan);use Amconfig;use File::Path;use strict;use lib "@amperldir@";use Amanda::Paths;use Amanda::Device;use Amanda::Debug;use Amanda::Config qw( :init :getconf config_dir_relative );use Amanda::Changer;# set up debugging so debug output doesn't interfere with test resultsAmanda::Debug::dbopen("installcheck");my $changer_filename = "$AMANDA_TMPDIR/chg-test";sub setup_changer {    my ($changer_script) = @_;    open my $chg_test, ">", $changer_filename or die("Could not create test changer");        $changer_script =~ s/\$AMANDA_TMPDIR/$AMANDA_TMPDIR/g;    print $chg_test "#! /bin/sh\n";    print $chg_test $changer_script;    close $chg_test;    chmod 0755, $changer_filename;}# set up and load a simple config with a tpchangermy $testconf = Amconfig->new();$testconf->add_param('tpchanger', "\"$changer_filename\"");$testconf->write();config_init($CONFIG_INIT_EXPLICIT_NAME, 'TESTCONF') or die("Could not load test config");# some variables we'll needmy ($error, $slot, $device);# OK, let's get started with some simple stuffsetup_changer <<'EOC';case "${1}" in    -slot)        case "${2}" in            1) echo "1 fake:1"; exit 0;;            2) echo "<ignored> slot 2 is empty"; exit 1;;            3) echo "<error> oh noes!"; exit 2;;            4) echo "1"; exit 0;; # test missing 'device' portion        esac;;    -reset) echo "reset ignored";;    -eject) echo "eject ignored";;    -clean) echo "clean ignored";;    -label)        case "${2}" in            foo?bar) echo "1 ok"; exit 0;;            *) echo "<error> bad label"; exit 1;;        esac;;    -info) echo "7 10 1 1"; exit 0;;    -search)         case "${2}" in            TAPE?01) echo "5 fakedev"; exit 0;;            *) echo "<error> not found"; exit 2;;        esac;;esacEOCis_deeply([ Amanda::Changer::loadslot(1) ], [0, "1", "fake:1"],    "A successful loadslot() returns the right stuff");($error, $slot, $device) = Amanda::Changer::loadslot(2);is($error, "slot 2 is empty", "A loadslot() with a benign error returns the right stuff");eval { Amanda::Changer::loadslot(3); };like($@, qr/.*oh noes!.*/, "A loadslot() with a serious error croaks");is_deeply([ Amanda::Changer::loadslot(4) ], [0, "1", undef],    "a response without a device string returns undef");is_deeply([ Amanda::Changer::reset() ], [ 0, "reset" ],    "reset() calls tapechanger -reset");is_deeply([ Amanda::Changer::eject() ], [ 0, "eject" ],    "eject() calls tapechanger -eject");is_deeply([ Amanda::Changer::clean() ], [ 0, "clean" ],    "clean() calls tapechanger -clean");is_deeply([ Amanda::Changer::label("foo bar") ], [ 0 ],    "label('foo bar') calls tapechanger -label 'foo bar' (note spaces)");is_deeply([ Amanda::Changer::query() ], [ 0, 7, 10, 1, 1 ],    "query() returns the correct values for a 4-value changer script");is_deeply([ Amanda::Changer::find("TAPE 01") ], [ 0, "5", "fakedev" ],    "find on a searchable changer invokes -search");eval { Amanda::Changer::find("TAPE 02") };ok($@, "A searchable changer croaks when the label can't be found");# Now a simple changer that returns three values for -infosetup_changer <<'EOC';case "${1}" in    -info) echo "11 13 0"; exit 0;;esacEOCis_deeply([ Amanda::Changer::query() ], [ 0, 11, 13, 0, 0 ],    "query() returns the correct values for a 4-value changer script");# set up 5 vtapesfor (my $i = 0; $i < 5; $i++) {    my $vtapedir = "$AMANDA_TMPDIR/chg-test-tapes/$i/data";    if (-e $vtapedir) {        rmtree($vtapedir)             or die("Could not remove '$vtapedir'");    }    mkpath($vtapedir)        or die("Could not create '$vtapedir'");}# label three of them (slot 2 is empty; slot 4 is unlabeled)for (my $i = 0; $i < 5; $i++) {    next if $i == 2 || $i == 4;    my $dev = Amanda::Device->new("file:$AMANDA_TMPDIR/chg-test-tapes/$i")        or die("Could not open device");    $dev->start($Amanda::Device::ACCESS_WRITE, "TAPE$i", "19780615010203")         or die("Could not write label");    $dev->finish();}# And finally a "stateful" changer that can support "scan" and "find"setup_changer <<'EOC';STATEFILE="$AMANDA_TMPDIR/chg-test-state"SLOT=0[ -f "$STATEFILE" ] && . "$STATEFILE"case "${1}" in    -slot)        case "${2}" in            current) ;;            0|1|2|3|4|5) SLOT="${2}";;            next|advance) SLOT=`expr $SLOT + 1`;;            prev) SLOT=`expr $SLOT - 1`;;            first) SLOT=0;;            last) SLOT=4;;        esac        # normalize 0 <= $SLOT  < 5        while [ "$SLOT" -ge 5 ]; do SLOT=`expr $SLOT - 5`; done        while [ "$SLOT" -lt 0 ]; do SLOT=`expr $SLOT + 5`; done        # signal an empty slot for slot 2        if [ "$SLOT" = 2 ]; then            echo "$SLOT slot $SLOT is empty"            EXIT=1        else            echo "$SLOT" "file:$AMANDA_TMPDIR/chg-test-tapes/$SLOT"        fi        ;;    -info) echo "$SLOT 5 1 0";;esacecho SLOT=$SLOT > $STATEFILEexit $EXITEOC($error, $slot, $device) = Amanda::Changer::loadslot(0);if ($error) { die("Error loading slot 0: $error"); }is_deeply([ Amanda::Changer::find("TAPE3") ], [0, "3", "file:$AMANDA_TMPDIR/chg-test-tapes/3"],    "Finds a tape after skipping an empty slot");($error, $slot, $device) = Amanda::Changer::loadslot(3);if ($error) { die("Error loading slot 3: $error"); }is_deeply([ Amanda::Changer::find("TAPE1") ], [0, "1", "file:$AMANDA_TMPDIR/chg-test-tapes/1"],    "Finds a tape after skipping an unlabeled but filled slot");my @scanresults;sub cb {    fail("called too many times") if (!@scanresults);    my $expected = shift @scanresults;    my $descr = pop @$expected;    my $done = pop @$expected;    is_deeply([ @_ ], $expected, $descr);    return 1;}# scan the whole changer($error, $slot, $device) = Amanda::Changer::loadslot(0);if ($error) { die("Error loading slot 0: $error"); }@scanresults = (    [ "0", "file:$AMANDA_TMPDIR/chg-test-tapes/0", 0, 0, "scan starts with slot 0" ],    [ "1", "file:$AMANDA_TMPDIR/chg-test-tapes/1", 0, 0, "next in slot 1" ],    [ undef, undef, "slot 2 is empty",                0, "slot 2 is empty" ],    [ "3", "file:$AMANDA_TMPDIR/chg-test-tapes/3", 0, 0, "next in slot 3" ],    [ "4", "file:$AMANDA_TMPDIR/chg-test-tapes/4", 0, 0, "next in slot 4" ],);Amanda::Changer::scan(\&cb);# make sure it stops when "done"($error, $slot, $device) = Amanda::Changer::loadslot(0);if ($error) { die("Error loading slot 0: $error"); }@scanresults = (    [ "0", "file:$AMANDA_TMPDIR/chg-test-tapes/0", 0, 1, "scan starts with slot 0" ],);Amanda::Changer::scan(\&cb);# cleanupunlink("$AMANDA_TMPDIR/chg-test");unlink("$AMANDA_TMPDIR/chg-test-state");rmtree("$AMANDA_TMPDIR/chg-test-tapes");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -