web/conf/rhn_dobby.conf | 2 +
web/modules/dobby/Dobby/BackupLog.pm | 10 ++++-
web/modules/dobby/Dobby/CLI/BackupCommands.pm | 45 ++++++++++++++++++++------
web/modules/dobby/Dobby/DB.pm | 10 +++--
web/modules/dobby/Dobby/Files.pm | 11 +++---
5 files changed, 56 insertions(+), 22 deletions(-)
New commits:
commit 6c56c3af376eb38829f700ad6557e0a80adcd2cf
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Oct 22 15:54:36 2012 +0200
implement "db-control examine/verify" on PG
diff --git a/web/modules/dobby/Dobby/CLI/BackupCommands.pm b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
index 74c4677..5af2f77 100644
--- a/web/modules/dobby/Dobby/CLI/BackupCommands.pm
+++ b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
@@ -47,10 +47,16 @@ sub register_dobby_commands {
-handler => \&command_restore);
}
-sub cut_dir {
+# returns $file cuted of prefix made from $cut_off_dir
+sub cut_off_dir {
my ($file, $cut_off_dir) = @_;
$file =~ s/^$cut_off_dir//;
- return dirname($file);
+ return $file;
+}
+
+sub cut_dir {
+ my ($file, $cut_off_dir) = @_;
+ return dirname(cut_off_dir($file, $cut_off_dir));
}
sub directory_contents {
@@ -178,7 +184,11 @@ sub command_restore {
# script itself.
my ($src, $dst) = ($file_entry->to, $file_entry->from);
- $src = File::Spec->catfile($restore_dir, basename($src));
+ if ($log->base_dir) {
+ $src = File::Spec->catfile($restore_dir, cut_off_dir($src, $log->base_dir));
+ } else { # old backups (prior spacewalk 1.8) do not have basedir and assume all in one dir
+ $src = File::Spec->catfile($restore_dir, basename($src));
+ }
my ($digest, $missing);
printf " %s", $src;
commit 3f5ed8d35fbd4a2076ad2f43032dbedd3e7d34cd
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Oct 22 15:53:19 2012 +0200
put into control file base directory
diff --git a/web/modules/dobby/Dobby/BackupLog.pm b/web/modules/dobby/Dobby/BackupLog.pm
index 3b63e35..9b010dd 100644
--- a/web/modules/dobby/Dobby/BackupLog.pm
+++ b/web/modules/dobby/Dobby/BackupLog.pm
@@ -22,7 +22,7 @@ use Storable qw/freeze thaw/;
use XML::LibXML;
our @ISA = qw/RHN::SimpleStruct/;
-our @simple_struct_fields = qw/start finish sid tablespaces archive_logs control_file type cold_files/;
+our @simple_struct_fields = qw/start finish sid tablespaces archive_logs control_file type cold_files base_dir/;
# UGLY HACK for now; use Storable instead of a real data structure.
# ugh.
@@ -61,6 +61,7 @@ sub fromXml() {
$log->start(getTextValue($doc,'start'));
$log->type(getTextValue($doc,'type'));
$log->finish(getTextValue($doc,'finish'));
+ $log->base_dir(getTextValue($doc,'basedir'));
foreach my $fileentry ($doc->getElementsByTagName('fileentry')){
@@ -92,6 +93,8 @@ sub toXml {
addTextValue($type, $doc, $self->type);
my $finish = $doc->createElement('finish');
addTextValue($finish, $doc, $self->finish);
+ my $base_dir = $doc->createElement('basedir');
+ addTextValue($base_dir, $doc, $self->base_dir);
my $archive_logs = $doc->createElement('archivelogs');
if (defined($self->archive_logs)) {
@@ -121,7 +124,8 @@ sub toXml {
$root->appendChild($start);
$root->appendChild($control_file);
$root->appendChild($type);
- $root->appendChild($finish);
+ $root->appendChild($finish);
+ $root->appendChild($base_dir);
my $retval = $root->toString . "\n";
return $retval;
diff --git a/web/modules/dobby/Dobby/CLI/BackupCommands.pm b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
index 81d403e..74c4677 100644
--- a/web/modules/dobby/Dobby/CLI/BackupCommands.pm
+++ b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
@@ -87,6 +87,7 @@ sub command_backup {
$log->type('cold');
$log->sid($d->sid);
$log->start(time);
+ $log->base_dir($backup_dir);
$|++;
print "Initiating cold backup of database ", $d->sid, "...\n";
commit ffdf3f19acbb6ab0f1b480c2e795205a9f68e3d9
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Oct 22 15:51:31 2012 +0200
if size is undef write 0
diff --git a/web/modules/dobby/Dobby/BackupLog.pm b/web/modules/dobby/Dobby/BackupLog.pm
index 8e47594..3b63e35 100644
--- a/web/modules/dobby/Dobby/BackupLog.pm
+++ b/web/modules/dobby/Dobby/BackupLog.pm
@@ -134,7 +134,7 @@ sub addTextValue {
my $node = shift;
my $doc = shift;
my $value = shift;
- if (!$value) {
+ if (not defined $value) {
$value = "";
}
my $textNode = $doc->createTextNode($value);
commit 50534140161e52e543a9c14ce7a034adc16c32ac
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Oct 22 15:50:46 2012 +0200
implement "db-control backup" on PG
diff --git a/web/conf/rhn_dobby.conf b/web/conf/rhn_dobby.conf
index 8cbc290..6212624 100644
--- a/web/conf/rhn_dobby.conf
+++ b/web/conf/rhn_dobby.conf
@@ -8,4 +8,6 @@ data_dir_format = /rhnsat/data/%s
hot_backup_dir_format = /rhnsat/hot-backups/%s/b%02d
archive_dir_format = /rhnsat/admin/%s/archive
+pg_data_dir_format = /var/lib/pgsql/data
+
oracle_user = oracle
diff --git a/web/modules/dobby/Dobby/CLI/BackupCommands.pm b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
index 7be38f6..81d403e 100644
--- a/web/modules/dobby/Dobby/CLI/BackupCommands.pm
+++ b/web/modules/dobby/Dobby/CLI/BackupCommands.pm
@@ -19,7 +19,7 @@ package Dobby::CLI::BackupCommands;
use Carp;
use Dobby::Files;
use Dobby::BackupLog;
-use File::Basename qw/basename/;
+use File::Basename qw/basename dirname/;
use File::Spec;
use Filesys::Df;
use POSIX;
@@ -47,14 +47,24 @@ sub register_dobby_commands {
-handler => \&command_restore);
}
+sub cut_dir {
+ my ($file, $cut_off_dir) = @_;
+ $file =~ s/^$cut_off_dir//;
+ return dirname($file);
+}
+
sub directory_contents {
- my $cli = shift;
- my $dir = shift;
+ my ($cli, $dir, $cut_off_dir) = @_;
my @files;
opendir DIR, $dir or $cli->fatal("opendir $dir: $!");
- push @files, grep { -f $_ } map { File::Spec->catfile($dir, $_) } readdir DIR;
+ my @dir_content = readdir DIR;
closedir DIR;
+ my @without_up_dir = grep {$_ ne '.' and $_ ne '..'} @dir_content;
+ foreach my $directory (grep { -d $_ } map { File::Spec->catfile($dir, $_) } @without_up_dir) {
+ push @files, directory_contents($cli, $directory, $cut_off_dir);
+ }
+ push @files, map {[$_, cut_dir($_, $cut_off_dir)]} grep { -f $_ } map { File::Spec->catfile($dir, $_) } @dir_content;
return @files;
}
@@ -71,6 +81,7 @@ sub command_backup {
$cli->fatal("Database is running; please stop before running a cold backup.") if $d->instance_state ne 'OFFLINE';
my $source_dir = $d->data_dir;
+ my $backend = PXT::Config->get('db_backend');
my $log = new Dobby::BackupLog;
$log->type('cold');
@@ -82,15 +93,18 @@ sub command_backup {
my @files;
- push @files, $d->lk_file;
- push @files, $d->sp_file;
+ if ($backend eq 'oracle') {
+ push @files, $d->lk_file;
+ push @files, $d->sp_file;
+ }
for my $dir ($d->data_dir, $d->archive_log_dir) {
- push @files, directory_contents($cli, $dir);
+ push @files, directory_contents($cli, $dir, $dir) if ($dir);
}
- for my $file (@files) {
- my $file_entry = Dobby::Files->backup_file($file, $backup_dir);
+ for my $ret (@files) {
+ my ($file, $rel_dir) = @{$ret};
+ my $file_entry = Dobby::Files->backup_file($rel_dir, $file, $backup_dir);
$log->add_cold_file($file_entry);
}
diff --git a/web/modules/dobby/Dobby/DB.pm b/web/modules/dobby/Dobby/DB.pm
index aabe64b..b5c696a 100644
--- a/web/modules/dobby/Dobby/DB.pm
+++ b/web/modules/dobby/Dobby/DB.pm
@@ -72,14 +72,16 @@ sub database_started {
sub data_dir {
my $self = shift;
-
- return sprintf($self->config->get("data_dir_format"), $self->sid);
+ my $backend = PXT::Config->get('db_backend');
+ return ($backend eq 'postgresql') ? $self->config->get("pg_data_dir_format") :
+ sprintf($self->config->get("data_dir_format"), $self->sid);
}
sub archive_log_dir {
my $self = shift;
-
- return sprintf($self->config->get("archive_dir_format"), $self->sid);
+ my $backend = PXT::Config->get('db_backend');
+ return ($backend eq 'postgresql') ? undef :
+ sprintf($self->config->get("archive_dir_format"), $self->sid);
}
sub oracle_homedir_relative {
diff --git a/web/modules/dobby/Dobby/Files.pm b/web/modules/dobby/Dobby/Files.pm
index 04b4082..62e15fa 100644
--- a/web/modules/dobby/Dobby/Files.pm
+++ b/web/modules/dobby/Dobby/Files.pm
@@ -18,7 +18,8 @@ package Dobby::Files;
use Digest::MD5;
use Compress::Zlib;
use File::Basename qw/basename/;
-
+use File::Spec;
+use File::Path;
# given source and dst, gzip a file into dst, returning the checksum
# of the original file
@@ -88,11 +89,11 @@ sub gunzip_copy {
}
sub backup_file {
- my $class = shift;
- my $file = shift;
- my $backup_dir = shift;
+ my ($class, $rel_dir, $file, $backup_dir) = @_;
- my $dest = sprintf("%s/%s.gz", $backup_dir, basename($file));
+ my $real_dest_dir = File::Spec->catdir($backup_dir, $rel_dir);
+ File::Path::mkpath($real_dest_dir) or (-d $real_dest_dir) or die ("Error: could not create directory $real_dest_dir\n");
+ my $dest = sprintf("%s/%s.gz", $real_dest_dir, basename($file));
$dest =~ s(//+)(/)g;
my $then = time;