All pastes #895609 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-02-07 23:05 UTC
rendered paste body
#!/usr/bin/env perl
use XML::XPath;
use XML::XPath::XMLParser;
use Getopt::Long;

sub aix_find_device
{
}

sub vx_find_device
{
        my $dg = shift;
        my $guid = shift;

        open(VXP, "vxprint -g $dg -tv -F '%name %guid' 2>/dev/null |");
        while(<VXP>)
        {
                chop;
                my ($vol,$id) = split(/ /);
                return $vol if($id =~ m/$guid/);
        }
        return undef;
}

sub vx_is_vol_enabled
{
        my $dg = shift;
        my $guid = shift;
}

sub is_mountpoint
{
        my $dir = shift;
}

%options=();
Getopt::Long::Configure(bundling);
GetOptions(
        "u" => \$options{unmountFlag},
        "l" => \$options{lvmFlag},
        "v" => \$options{vxvmFlag},
        "a" => \$options{allFlag},
        "g=s" => \$options{mountGroupFlag}
);

my $unmount = 1 if(defined($options{unmountFlag}));

## Build the XPath Query:
$query = "/imports";

$query .= "/*" if(!defined($options{lvmFlag}) and !defined($options{vxvmFlag}));
$query .= "/*" if(defined($options{lvmFlag}) and defined($options{vxvmFlag}));
$query .= "/vxdg" if(defined($options{vxvmFlag}) and not defined($options{lvmFlag}));
$query .= "/lvmvg" if(defined($options{lvmFlag}) and not defined($options{vxvmFlag}));
$query .= "[\@group=\"" . $options{mountGroupFlag} . "\"]" if defined($options{mountGroupFlag});
$query .= "[\@auto=\"yes\"]" unless defined($options{allFlag});

#print $query, "\n";

my $parser = XML::XPath->new(filename => "data.xml");
my $nodeset = $parser->find($query);

print "No backup sets returned with current options.\n" if($nodeset->size() eq 0);

foreach my $node ($nodeset->get_nodelist) {
        my $diskGroup = $node->getAttribute("name");
        my $storageNode = $node->getAttribute("storageNode");

        print "Perfoming actions on $diskGroup...\n";
        if(!defined($unmount))
        {
                        print "\tImporting disk group... ";
                        system "vxdg -Ct import $diskGroup";
                        print "$? ok\n"; # TODO: Error check this output
        }

        my $sub = XML::XPath->new(xml => XML::XPath::XMLParser::as_string($node));

        my $mounts = $sub->find("/vxdg/vxmount");
        foreach my $mount ($mounts->get_nodelist)
        {
                        my $id = $mount->getAttribute("id");
                        print "\tLooking for $id... ";
                        my $volume = vx_find_device($diskGroup, $id);
                        if(!defined $volume)
                        {
                                print "failed.\n";
                                next;
                        } else {
                                print "$volume... ";
                        }
                        my $blockDevice = "/dev/vx/dsk/$diskGroup/$volume";
                        my $fsck = $mount->getAttribute("fsck");
                        my $dio = $mount->getAttribute("directIo");
                        my $mountOptions = "-o convosync=direct" if($dio =~ m/yes/);
                        my $mountPoint = $mount->string_value();

                        if(!defined($unmount))
                        {
                                        print "enabling... ";
                                        system "vxvol -g $diskGroup start $volume >/dev/null 2>&1";

                                        if($fsck =~ m/yes/)
                                        {
                                                        print "fscking... ";
                                                        system "fsck -V vxfs $blockDevice >/dev/null 2>&1";
                                                        print "$?... ";
                                        }

                                        print "mounting on $mountPoint... ";
                                        system "mount -V vxfs $mountOptions $blockDevice $mountPoint >/dev/null 2>&1";
                                        print "$?... complete.\n";
                        } else {
                                        print "unmounting from $mountPoint... ";
                                        system "umount $blockDevice >/dev/null 2>&1";
                                        print "$?... ";
                                        print "stopping $volume... ";
                                        system "vxvol -g $diskGroup stop $volume >/dev/null 2>&1";
                                        print "$?... complete.\n";
                        }

        }

        if(defined($unmount))
        {
                print "\tDeporting disk group... ";
                system "vxdg deport $diskGroup >/dev/null 2>&1";
                print "$?... done.\n"
        }
        print "Complete.\n";
}