]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Add a new catalog backup script
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 18 Aug 2008 20:16:16 +0000 (20:16 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 18 Aug 2008 20:16:16 +0000 (20:16 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7498 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/patches/testing/make_catalog_backup.pl.in [new file with mode: 0644]

diff --git a/bacula/patches/testing/make_catalog_backup.pl.in b/bacula/patches/testing/make_catalog_backup.pl.in
new file mode 100644 (file)
index 0000000..5d53e35
--- /dev/null
@@ -0,0 +1,168 @@
+#!/usr/bin/env perl
+use strict;
+
+=head1 SCRIPT
+
+  This script dumps your Bacula catalog in ASCII format
+  It works for MySQL, SQLite, and PostgreSQL
+
+=head1 USAGE
+
+    make_catalog_backup.pl MyCatalog
+
+=head1 LICENSE
+
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file 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 Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of Kern Sibbald.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
+   Switzerland, email:ftf@fsfeurope.org.
+
+=cut
+
+my $cat = shift or die "Usage: $0 catalogname";
+my $dir='@sbindir@/bacula-dir -B -c @sysconfdir@/bacula-dir.conf';
+my $wd = "@working_dir@";
+
+sub dump_sqlite
+{
+    my %args = @_;
+
+    exec("echo .dump | sqlite '$wd/$args{db_name}.db' > '$wd/$args{db_name}.sql'");
+    print "Error while executing sqlite dump $!\n";
+    return 1;
+}
+
+sub dump_sqlite3
+{
+    my %args = @_;
+
+    exec("echo .dump | sqlite3 '$wd/$args{db_name}.db' > '$wd/$args{db_name}.sql'");
+    print "Error while executing sqlite dump $!\n";
+    return 1;
+}
+
+# TODO: use just ENV and drop the pg_service.conf file
+sub dump_pgsql
+{
+    my %args = @_;
+    umask(0077);
+    unlink("$wd/pg_service.conf");
+    open(PG, ">$wd/pg_service.conf") 
+        or die "Can't open $wd/pg_service.conf for writing $@";
+    print PG "[bacula]
+dbname=$args{db_name}
+user=$args{db_user}
+password=$args{db_password}
+";
+    if ($args{db_address}) {
+        print PG "address=$args{db_address}\n";
+        $ENV{PGHOST}=$args{db_address};
+    }
+    if ($args{db_port}) {
+        print PG "port=$args{db_port}\n";
+        $ENV{PGPORT}=$args{db_port};
+    }
+    
+    close(PG);
+    $ENV{PGDATABASE}=$args{db_name};
+    $ENV{PGUSER}=$args{db_user};
+    $ENV{PGPASSWORD}=$args{db_password};
+    exec("HOME='$wd' PGSERVICE=bacula PGSYSCONFDIR='$wd' pg_dump -c > '$wd/$args{db_name}.sql'");
+    print "Error while executing postgres dump $!\n";
+    return 1;               # in case of error
+}
+
+sub dump_mysql
+{
+    my %args = @_;
+    umask(0700);
+    unlink("$wd/.my.cnf");
+    open(MY, ">$wd/.my.cnf") 
+        or die "Can't open $wd/.my.cnf for writing $@";
+    $args{db_address} = $args{db_address} || "localhost";
+    print MY "[client]
+host=$args{db_address}
+user=$args{db_user}
+password=$args{db_password}
+";
+    if ($args{db_port}) {
+        print MY "port=%args{db_port}\n";
+    }
+    
+    close(MY);
+
+    exec("HOME='$wd' mysqldump -f --opt $args{db_name} > '$wd/$args{db_name}.sql'");
+    print "Error while executing mysql dump $!\n";
+    return 1;
+}
+
+sub dump_catalog
+{
+    my %args = @_;
+    if ($args{db_type} eq 'SQLite') {
+        dump_sqlite(%args);
+    } elsif ($args{db_type} eq 'SQLite3') {
+        dump_sqlite3(%args);
+    } elsif ($args{db_type} eq 'PostgreSQL') {
+        dump_pgsql(%args);
+    } elsif ($args{db_type} eq 'MySQL') {
+        dump_mysql(%args);
+    } else {
+        die "This database type isn't supported";
+    }
+}
+
+open(FP, "$dir|") or die "Can't get catalog information $@";
+# catalog=MyCatalog
+# db_type=SQLite
+# db_name=regress
+# db_driver=
+# db_user=regress
+# db_password=
+# db_address=
+# db_port=0
+# db_socket=
+my %cfg;
+
+while(my $l = <FP>)
+{
+    if ($l =~ /catalog=(.+)/) {
+        if (exists $cfg{catalog} and $cfg{catalog} eq $cat) {
+            exit dump_catalog(%cfg);
+        }
+        %cfg = ();              # reset
+    }
+
+    if ($l =~ /(\w+)=(.+)/) {
+        $cfg{$1}=$2;
+    }
+}
+
+if (exists $cfg{catalog} and $cfg{catalog} eq $cat) {
+    exit dump_catalog(%cfg);
+}
+
+print "Can't find your catalog ($cat) in director configuration\n";
+exit 1;