#!/usr/bin/perl -w # Copyright (C) 2006, 2007 MySQL AB, 2009 Sun Microsystems, Inc. # All rights reserved. Use is subject to license terms. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA use strict; if(@ARGV < 1) { print STDERR "Usage:\n"; print STDERR "\tndb_error_reporter config.ini [username] [--fs]\n\n"; print STDERR "\tusername is a user that you can use to ssh into\n"; print STDERR "\t all of your nodes with.\n\n"; print STDERR "\t--fs means include the filesystems in the report\n"; print STDERR "\t WARNING: This may require a lot of disk space.\n"; print STDERR "\t Only use this option when asked to.\n\n"; exit(1); } my $config_file= $ARGV[0]; my $config_get_fs= 0; my $config_username= ''; if(defined($ARGV[1])) { $config_get_fs= 1 if $ARGV[1] eq '--fs'; $config_username= $ARGV[1].'@' if $ARGV[1] ne '--fs'; $config_get_fs= (defined $ARGV[2] && $ARGV[2] eq '--fs')?1:$config_get_fs; } if(!stat($config_file)) { print STDERR "Cannot open configuration file.\n\n"; exit(1); } my @nodes= split ' ',`ndb_config --config-file=$ARGV[0] --nodes --query=id --type=ndbd`; push @nodes, split ' ',`ndb_config --config-file=$ARGV[0] --nodes --query=id --type=ndb_mgmd`; sub config { my $nodeid= shift; my $query= shift; my $res= `ndb_config --config-file=$ARGV[0] --id=$nodeid --query=$query`; chomp $res; $res; } my @t= localtime(); my $reportdir= sprintf('ndb_error_report_%u%02u%02u%02u%02u%02u', ($t[5]+1900),($t[4]+1),$t[3],$t[2],$t[1],$t[0]); if(stat($reportdir) || stat($reportdir.'tar.bz2')) { print STDERR "It looks like another ndb_error_report process is running.\n"; print STDERR "If that is not the case, remove the ndb_error_report directory"; print STDERR " and run ndb_error_report again.\n\n"; exit(1); } mkdir($reportdir); foreach my $node (@nodes) { print "\n\n Copying data from node $node". (($config_get_fs)?" with filesystem":""). "\n\n"; my $recurse= ($config_get_fs)?'-r ':''; system 'scp -p '.$recurse.$config_username.config($node,'host'). ':'.config($node,'datadir')."/ndb_".$node."* ". "$reportdir/\n"; } print "\n\n Copying configuration file...\n\n\t$config_file\n\n"; system "cp -p $config_file $reportdir/"; my $r = system 'bzip2 2>&1 > /dev/null < /dev/null'; my $outfile; if($r==0) { $outfile= "$reportdir.tar.bz2"; system "tar cf - $reportdir|bzip2 > $outfile"; } else { $outfile= "$reportdir.tar.gz"; system "tar cf - $reportdir|gzip > $outfile"; } system "rm -rf $reportdir"; print "\n\nPlease attach $outfile to your error report\n\n";