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";
}