Networker

Re: [Networker] Getting networker to mount all available devices in a pool?

2013-03-20 10:11:14
Subject: Re: [Networker] Getting networker to mount all available devices in a pool?
From: Yaron Zabary <yaron AT ARISTO.TAU.AC DOT IL>
To: NETWORKER AT LISTSERV.TEMPLE DOT EDU
Date: Wed, 20 Mar 2013 16:10:53 +0200
That is my remount script. I wrote it after I realized AFTD get unmounted. I run it from cron every hour.

[root@legato ~]# more /usr/local/TAUSRC/Local/ToolBox/remountaftd.pl
#!/usr/bin/perl -I/usr/local/TAUSRC/Local/ToolBox

use Nsradmin;

set_nsradmin("/usr/sbin/nsradmin");

$server = "legato";
$query  = "type: NSR device ; media type: adv_file";
$options = "";

@reslist = query($server, $query, $show, $options);

foreach $res (@reslist)
      {
        %attrlist = %{$res};
        $unmount = 0;
        foreach $attr (sort keys %attrlist)
        {
           @vallist = @{$attrlist{$attr}};
           $device = $vallist[0] if($attr eq "name");
$unmount = 1 if(($attr eq "volume name") && ($vallist[0] eq ""));
        }
        if ($unmount == 1)
        {
          system "nsrmm -m -f $device\n";
system "/usr/ucb/Mail -s 'Remounted $device' yaron\@aristo.tau.ac.il < /dev/null";
        }
}


 This is the Nsradmin perl package
[root@legato ~]# cat /usr/local/TAUSRC/Local/ToolBox/Nsradmin.pm

package Nsradmin;
require Exporter;
@ISA    = qw(Exporter);
@EXPORT = qw(
        set_nsradmin
        create_tmpfile
        query
        write_lines
        $nsradmin
);

# Courtesy of Byron Servies bservies AT PACANG DOT COM

$nsradmin = "nsradmin";

1;

sub set_nsradmin {
        my ($path) = @_;
        $nsradmin = $path;
}

sub query {
        my ($server, $query, $show, $options) = @_;
        my @lines;
        my @reslist;
        my @reslines;
        my %attrlist;
        my $cmd;
        my $append;
        my $append_next;

        # Prep the command to change display options
        $options = "option $options";

        # Prep the command for which attributes to show
        $show = "show $show";

        # Prep the command for the query to perform
        $query = "print $query";

        # Write the query to a temporary file
        $queryfile = &write_lines($options, $show, $query);

        # Determine the command to execute
        $cmd = "$nsradmin -s $server -i $queryfile";

        # Execute the query and parse the results
        $append = 0;
        open CMD, "$cmd |" || die "could not execute \"$cmd\"";
        while (<CMD>) {
                # Skip the option output
                next if (/^Dynamic|Hidden|Resource/o);

                # Skip the list of display options
                if (/^Display options:/) {
                        # Read the next 3 lines
                        $_ = <CMD>;
                        $_ = <CMD>;
                        $_ = <CMD>;
                        next;
                }

                # Skip any show lines
                next if (/^Will show all attributes/);

                if ($append == 0 && /^\s*$/) {
                        #
# Blank lines start a new resource, but only if we are not
                        # searching for the end of the previous attribute.
                        #
                        if (scalar @lines > 0) {
                                # The lines array represents a resource
                                push @reslines, [ @lines ];
                                @lines = ();
                        }
                        next;
                }

# Eliminate leading and trailing whitespace only if we are not
                # still searching for the end of an
                s/^\s+// unless ($append);
                s/\s+$// unless ($append);

                if (/\\\s*$/) {
# Remove the backslash from the input line if it exists
                        s/\\\s*$//;
                        $append_next = 1;
                }

# Determine if this line should be added to the previous line or not
                if ($append != 0) {
                        # Append this line to the last line in the array
                        $lines[$#lines] .= $_;
                } elsif ($#lines != -1 && $lines[$#lines] !~ /;\s*/) {
                        #
                        # The previous line does not end with a semi-colon.
                        # Add the current line to the previous line
                        #
                        $lines[$#lines] .= $_;
                } else {
                        # Add the ordinary line to the list of lines
                        push @lines, $_;
                }

                if ($lines[$#lines] !~ /;\s*/o) {
                        #
# The current line does not end with a semi-colon. The # next line must be appended until one is found and the
                        # value list is complete.
                        #
                        $append_next = 1;
                }
                $append = $append_next;
                $append_next = 0;
        }

        #
# Append the most recent set of lines to the results if there was no
        # blank line at the end of the output
        #
        if (scalar @lines > 0) {
                push @reslines, [ @lines ];
                @lines = ();
        }

        # Delete the query file.  The command pipeline closes itself.
        unlink $queryfile;

        #
# Separete the lines of each resource into a list of hashes. The hash
        # keys are the attribute names and their values are a list of the
        # attributes values.
        #
        foreach $lines (@reslines) {
                %attrlist = ();

# The lines are in and compressed. Now separated them into a hash
                foreach $line (@$lines) {
                        if ($line =~ /(^[\w\s]+):(.*)$/ms) {
                                $attrname = $1;
                                $2 =~ /^\s*(.*);$/ms;
                                $value = $1;

                                # The following loop is from the book
# "Mastering Regular Expressions", page 205. # Jeffrey Friedl, O'Reilly & Associates, Inc.
                                #
                                # It was modified to use the delimiter
                                # (, ) instead of a simle comma for use
                                # with RAP.
                                #
                                @vallist = ();
while ($value =~ m/"([^"\\]*(\\.[^"\\]*)*)"(,\s+)?|([^,]+)(,\s+)?|(,\s+)/g) { push(@vallist, defined($1) ? $1 : $4);
                                }
                                push(@vallist, undef) if $value =~ m/,$/;


                                #
                                # Make sure the attribute is in the array,
# regardless of how many values it may or may
                                # not have.
                                #
                                $attrlist{$attrname} = ();
                                foreach $value (@vallist) {
                                        #
# strip leading and trailing whitespace from
                                        # all values
                                        #
                                        $value =~ s/^\s+//;
                                        $value =~ s/\s+$//;

                                        # Skip empty values
                                        next if (length $value == 0);
push @{$attrlist{$attrname}}, $value;
                                }
                        }
                }

                # Add the attrlist hash to the resource list
                push @reslist, { %attrlist };

        }

        return @reslist;
}

sub create_tmpfile {
        my $filename;

        if (defined $ENV{TMPDIR}) {
                $filename = $ENV{TMPDIR} . "/" . "tmp$$";
        } elsif (defined $ENV{TMP}) {
                $filename = $ENV{TMP} . "/" . "tmp$$";
        } else {
                $filename = "/tmp/" . "tmp$$";
        }
}

sub write_lines {
        my @lines = @_;

        $tmpfile = &create_tmpfile;

open TMPFILE, "> $tmpfile" || die "could open $tmpfile for writting";
        print TMPFILE join "\n", @lines;
        print TMPFILE "\n";
        close TMPFILE;

        return $tmpfile;
}

1;



On 20/03/2013 15:47, Paul Key wrote:
Solaris 10
NetWorker Management Console version 3.4.Build.187
based on NetWorker version 7.4.Build.187

We have disks mounted as zfs 'bud' X4500 pool volumes that are used for
incremental backups. They are of course visible using the GUI under
Devices. There are 170 volumes or partitions across the allocated disk
arrays.

The thing is the backup server doesn't mount all the bud volumes all the
time - for example after running /etc/init.d/networker start not all the
bud volumes get mounted automatically. This means that restores with
savesets on unmounted bud volumes hang until the required volumes are
manually mounted.

Is there a configuration option to 'force' networker to mount all
available volumes in a specified pool? In this case the pool of bud disk
volumes.

Thanks

Paul

--

--

-- Yaron.