#!/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() { 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"; }