From b8a5d36c00ad03c5680259b2167a7e80b02bc18e Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Mon, 18 Aug 2008 20:16:16 +0000 Subject: [PATCH] ebl Add a new catalog backup script git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7498 91ce42f0-d328-0410-95d8-f526ca767f89 --- .../patches/testing/make_catalog_backup.pl.in | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 bacula/patches/testing/make_catalog_backup.pl.in diff --git a/bacula/patches/testing/make_catalog_backup.pl.in b/bacula/patches/testing/make_catalog_backup.pl.in new file mode 100644 index 0000000000..5d53e352c9 --- /dev/null +++ b/bacula/patches/testing/make_catalog_backup.pl.in @@ -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 = ) +{ + 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; -- 2.39.5