X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Famgetconf.pl;fp=common-src%2Famgetconf.pl;h=86870e1e3e1633c3178ab0b7926ab15968459c62;hb=2627875b7d18858bc1f9f7652811e4d8c15a23eb;hp=0000000000000000000000000000000000000000;hpb=fb2bd066c2f8b34addafe48d62550e3033a59431;p=debian%2Famanda diff --git a/common-src/amgetconf.pl b/common-src/amgetconf.pl new file mode 100644 index 0000000..86870e1 --- /dev/null +++ b/common-src/amgetconf.pl @@ -0,0 +1,303 @@ +#! @PERL@ +# Copyright (c) 2005-2008 Zmanda Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published +# by the Free Software Foundation. +# +# 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., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Contact information: Zmanda Inc., 465 S Mathlida Ave, Suite 300 +# Sunnyvale, CA 94086, USA, or: http://www.zmanda.com + +use lib '@amperldir@'; +use strict; +use Amanda::Config qw( :getconf :init ); +use Amanda::Debug qw( :logging ); +use Amanda::Util qw( :constants ); +use Amanda::Paths; +use Amanda::Constants; +use Getopt::Long; + +# Implementation note: this application is a bit funny, because it does not +# set up Amanda fully until some time into processing. This lets it respond +# with build configuration information without a config file, and lets it set +# up debugging for the caller. +# +# The most obvious consequence is that, rather than calling die (which interfaces +# with Amanda::Debug), this file uses a locally defined 'fail' to print error +# messages. + +sub usage { + print < + (any ordering of options and arguments is acceptable) + +--client is equivalent to --execute-where client + +--execute-where tells amgetconf whether to operate on the client or the +server; the server is the default. + +paramname can be one of + dbopen.APPNAME -- open a debug file + dbclose.APPNAME:FILENAME -- close debug file FILENAME + build.PARAM -- get a build parameter + PARAM -- get an Amanda configuration parameter + +For all but Amanda configuration parameters, the option is +ignored, but must be present. For Amanda configuration parameters, +values in subsections are specified in the form TYPE:NAME:PARAMETER. + +With --list, PARAM can be one of +EOF + for my $name (keys %Amanda::Config::subsection_names) { + print " $name\n"; + } + exit(1); +} + +sub fail { + print STDERR @_, "\n"; + exit(1); +} + +sub no_such_param { + my ($parameter) = @_; + fail("amgetconf: no such parameter \"$parameter\""); +} + +## build parameters + +my %build_info = ( + # NOTE TO MAINTAINERS: + # If you add to this list, be sure to also add the new parameter + # amgetconf(8) manual page. Note that all keys are lower-case. + + ## directories from Amanda::Paths + + 'bindir' => $bindir, + 'sbindir' => $sbindir, + 'libexecdir' => $libexecdir, + 'amlibexecdir' => $amlibexecdir, + 'mandir' => $mandir, + 'amanda_tmpdir' => $AMANDA_TMPDIR, + 'config_dir' => $CONFIG_DIR, + 'amanda_dbgdir' => $AMANDA_DBGDIR, + 'application_dir' => $APPLICATION_DIR, + 'gnutar_listed_incremental_dir' => $GNUTAR_LISTED_INCREMENTAL_DIR, + 'listed_inc_dir' => $GNUTAR_LISTED_INCREMENTAL_DIR, # (historical alias) + + ## constants from Amanda::Constants + + # build environment info + + 'cc' => $Amanda::Constants::CC, + 'version' => $Amanda::Constants::VERSION, + 'assertions' => $Amanda::Constants::ASSERTIONS, + 'use_version_suffixes' => $Amanda::Constants::USE_VERSION_SUFFIXES, + 'locking' => $Amanda::Constants::LOCKING, + + # executable paths + + 'dump' => $Amanda::Constants::DUMP, + 'restore' => $Amanda::Constants::RESTORE, + 'vdump' => $Amanda::Constants::VDUMP, + 'vrestore' => $Amanda::Constants::VRESTORE, + 'xfsdump' => $Amanda::Constants::XFSDUMP, + 'xfsrestore' => $Amanda::Constants::XFSRESTORE, + 'vxdump' => $Amanda::Constants::VXDUMP, + 'vxrestore' => $Amanda::Constants::VXRESTORE, + 'samba_client' => $Amanda::Constants::SAMBA_CLIENT, + 'gnutar' => $Amanda::Constants::GNUTAR, + 'star' => $Amanda::Constants::STAR, + 'compress_path' => $Amanda::Constants::COMPRESS_PATH, + 'uncompress_path' => $Amanda::Constants::UNCOMPRESS_PATH, + 'aix_backup' => $Amanda::Constants::AIX_BACKUP, + 'dump_returns_1' => $Amanda::Constants::DUMP_RETURNS_1, + + # amanda modules + + 'bsd_security' => $Amanda::Constants::BSD_SECURITY, + 'bsdudp_security' => $Amanda::Constants::BSDUDP_SECURITY, + 'bsdtcp_security' => $Amanda::Constants::BSDTCP_SECURITY, + 'krb4_security' => $Amanda::Constants::KRB4_SECURITY, + 'krb5_security' => $Amanda::Constants::KRB5_SECURITY, + 'ssh_security' => $Amanda::Constants::SSH_SECURITY, + 'rsh_security' => $Amanda::Constants::RSH_SECURITY, + 'use_amandahosts' => $Amanda::Constants::USE_AMANDAHOSTS, + + # build-time constants + + 'amanda_debug_days' => $Amanda::Constants::AMANDA_DEBUG_DAYS, + 'default_server' => $Amanda::Constants::DEFAULT_SERVER, + 'default_amandates_file' => $Amanda::Constants::DEFAULT_AMANDATES_FILE, + 'default_config' => $Amanda::Constants::DEFAULT_CONFIG, + 'default_tape_server' => $Amanda::Constants::DEFAULT_TAPE_SERVER, + 'default_tape_device' => $Amanda::Constants::DEFAULT_TAPE_DEVICE, + 'client_login' => $Amanda::Constants::CLIENT_LOGIN, + 'use_rundump' => $Amanda::Constants::USE_RUNDUMP, + 'check_userid' => $Amanda::Constants::CHECK_USERID, + + # compression information + + 'compress_suffix' => $Amanda::Constants::COMPRESS_SUFFIX, + 'compress_fast_opt' => $Amanda::Constants::COMPRESS_FAST_OPT, + 'compress_best_opt' => $Amanda::Constants::COMPRESS_BEST_OPT, + 'uncompress_opt' => $Amanda::Constants::UNCOMPRESS_OPT, + + # kerberos information + + 'ticket_lifetime' => $Amanda::Constants::TICKET_LIFETIME, + 'server_host_principal' => $Amanda::Constants::SERVER_HOST_PRINCIPAL, + 'server_host_instance' => $Amanda::Constants::SERVER_HOST_INSTANCE, + 'server_host_key_file' => $Amanda::Constants::SERVER_HOST_KEY_FILE, + 'client_host_principal' => $Amanda::Constants::CLIENT_HOST_PRINCIPAL, + 'client_host_instance' => $Amanda::Constants::CLIENT_HOST_INSTANCE, + 'client_host_key_file' => $Amanda::Constants::CLIENT_HOST_KEY_FILE, + # (historical typos:) + 'server_host_principle' => $Amanda::Constants::SERVER_HOST_PRINCIPAL, + 'client_host_principle' => $Amanda::Constants::CLIENT_HOST_PRINCIPAL, + # (for testing purposes) + '__empty' => '', + +); + +sub build_param { + my ($parameter, $opt_list) = @_; + + if ($opt_list) { + usage() unless ($parameter eq "build"); + + for my $pname (sort keys %build_info) { + print "$pname\n"; + } + } else { + my ($pname) = $parameter =~ /^build\.(.*)/; + + my $val = $build_info{lc $pname}; + no_such_param($parameter) unless (defined($val)); + + print "$val\n"; + } +} + +## dbopen or dbclose + +sub db_param { + my ($parameter, $opt_list) = @_; + my ($appname, $filename); + if (($appname) = $parameter =~ /^dbopen\.(.*)/) { + $appname =~ s/[^[:alnum:]]/_/g; + Amanda::Util::setup_application($appname, "server", $CONTEXT_CMDLINE); + print Amanda::Debug::dbfn(), "\n"; + } elsif (($appname, $filename) = $parameter =~ /^dbclose\.([^:]*):(.*)/) { + fail("debug file $filename does not exist") unless (-f $filename); + Amanda::Debug::dbreopen($filename, ''); + Amanda::Debug::dbclose(); + print "$filename\n"; + } else { + fail("cannot parse $parameter"); + } +} + +## regular configuration parameters + +sub conf_param { + my ($parameter, $opt_list) = @_; + + if ($opt_list) { + # getconf_list will return an empty list for any unrecognized name, + # so first check that the user has supplied a real subsection + no_such_param($parameter) + unless defined($Amanda::Config::subsection_names{$parameter}); + my @list = getconf_list($parameter); + + for my $subsec (@list) { + print "$subsec\n"; + } + } else { + no_such_param($parameter) + unless defined(getconf_byname($parameter)); + my @strs = getconf_byname_strs($parameter, 0); + + for my $str (@strs) { + print "$str\n"; + } + } +} + +## Command-line parsing + +my $opt_list = ''; +my $config_overwrites = new_config_overwrites($#ARGV+1); +my $execute_where = undef; + +Getopt::Long::Configure(qw{bundling}); +GetOptions( + 'list|l' => \$opt_list, + 'o=s' => sub { add_config_overwrite_opt($config_overwrites, $_[1]); }, + 'execute-where=s' => sub { + my $where = lc($_[1]); + fail("Invalid value ($_[1]) for --execute-where. Must be client or server.") + unless $where eq 'client' or $where eq 'server'; + fail("--execute-where=server conflicts with --execute-where=client or --client.") + unless !defined($execute_where) || ( + ($where eq 'client' && $execute_where) || + ($where eq 'server' && !$execute_where)); + $execute_where = ($where eq 'client')? $CONFIG_INIT_CLIENT : 0; + }, + 'client' => sub { + fail("--execute-where=server conflicts with --execute-where=client or --client.") + unless !defined($execute_where) || $execute_where; + $execute_where = $CONFIG_INIT_CLIENT; + } +) or usage(); + +my $config_name; +my $parameter; + +if (@ARGV == 1) { + $parameter = $ARGV[0]; +} elsif (@ARGV >= 2) { + # note that we ignore any arguments past these two. Amdump lazily passes + # such arguments on to us, so we have no choice. + $config_name = $ARGV[0]; + $parameter = $ARGV[1]; +} else { + usage(); +} + +## Now start looking at the parameter. + +if ($parameter =~ /^build(?:\..*)?/) { + build_param($parameter, $opt_list); + exit(0); +} + +if ($parameter =~ /^db(open|close)\./) { + db_param($parameter, $opt_list); + exit(0); +} + +# finally, finish up the application startup procedure +Amanda::Util::setup_application("amgetconf", "server", $CONTEXT_SCRIPTUTIL); +config_init($CONFIG_INIT_EXPLICIT_NAME | $CONFIG_INIT_USE_CWD | $execute_where, $config_name); +apply_config_overwrites($config_overwrites); +my ($cfgerr_level, @cfgerr_errors) = config_errors(); +if ($cfgerr_level >= $CFGERR_WARNINGS) { + config_print_errors(); + if ($cfgerr_level >= $CFGERR_ERRORS) { + die("errors processing config file"); + } +} + +Amanda::Util::finish_setup($RUNNING_AS_ANY); + +conf_param($parameter, $opt_list);