X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Famserverconfig.pl;h=919c71072f2f7a05770c85d20fe84278b4966531;hb=HEAD;hp=ad0abc4f2a8af00a801ede1a705fe5678ee2275f;hpb=fd48f3e498442f0cbff5f3606c7c403d0566150e;p=debian%2Famanda diff --git a/server-src/amserverconfig.pl b/server-src/amserverconfig.pl index ad0abc4..919c710 100755 --- a/server-src/amserverconfig.pl +++ b/server-src/amserverconfig.pl @@ -1,10 +1,11 @@ #!@PERL@ # -# Copyright (c) 2007,2008,2009 Zmanda, Inc. All Rights Reserved. +# Copyright (c) 2007-2012 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 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; either version 2 +# of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY @@ -23,17 +24,20 @@ use lib '@amperldir@'; use Getopt::Long; use Time::Local; use File::Copy; +use File::Path; use Socket; # for gethostbyname use Amanda::Paths; +use Amanda::Util qw( :constants ); +use Amanda::Constants; my $confdir="$CONFIG_DIR"; my $tmpdir="$AMANDA_DBGDIR"; -my $amandahomedir="$localstatedir/lib/amanda"; +my $amandahomedir="$localstatedir/amanda"; my $templatedir="$amdatadir/template.d"; #rpm install template files here my $def_tapedev="file:$amandahomedir/vtapes"; -my $amanda_user="@CLIENT_LOGIN@"; -my $def_config="@DEFAULT_CONFIG@"; +my $amanda_user="$Amanda::Constants::CLIENT_LOGIN"; +my $def_config="$Amanda::Constants::DEFAULT_CONFIG"; my $def_dtimeout="1800"; my $def_ctimeout="30"; my $def_etimeout="300"; @@ -46,6 +50,8 @@ my $holding_err=0; my $template_only=0; my $parentdir; my $host; +my @pw = getpwuid($<); +my $dumpuser = $pw[0]; #usage @@ -104,38 +110,27 @@ sub log_and_die { } -sub is_user_right { - my $user = `whoami`; - chomp($user); - ( $user eq $amanda_user ) || - die ("ERROR: $0 must be run by $amanda_user\n", 0); -} - - # rpm installation should have taken care of these. Create one if it's not there sub check_gnutarlist_dir { if ( -e "$amandahomedir/gnutar-lists" ) { &mprint ("$amandahomedir/gnutar-lists directory exists\n"); } else { - mkdir ("$amandahomedir/gnutar-lists", $def_perm) || - &log_and_die ("ERROR: mkdir:$amandahomedir/gnutar-lists failed: $!\n", 0); + mkpath ("$amandahomedir/gnutar-lists", $def_perm) || + &log_and_die ("ERROR: mkpath:$amandahomedir/gnutar-lists failed: $!\n", 0); } } sub create_conf_dir { - unless ( -e $confdir ) { - &log_and_die ("ERROR: $confdir does not exist\n", 0); - } unless ( -e "$confdir/$config" ) { - mkdir ("$confdir/$config", $def_perm) || - &log_and_die ("ERROR: mkdir: $confdir/$config failed: $!\n", 0); # $! = system error + mkpath ("$confdir/$config", $def_perm) || + &log_and_die ("ERROR: mkpath: $confdir/$config failed: $!\n", 0); # $! = system error } else { &log_and_die ("ERROR: Configuration $config exists\n", 0); } unless ( -e "$confdir/template.d" ) { - mkdir ("$confdir/template.d", $def_perm) || - &log_and_die ("ERROR: mkdir: $confdir/template.d failed: $!\n", 0); + mkpath ("$confdir/template.d", $def_perm) || + &log_and_die ("ERROR: mkpath: $confdir/template.d failed: $!\n", 0); &mprint ("$confdir/template.d directory created\n"); } } @@ -163,10 +158,10 @@ sub copy_template_file { sub create_curinfo_index_dir { - mkdir("$confdir/$config/curinfo", $def_perm) || - &log_and_die ("ERROR: mkdir: $confdir/$config/curinfo failed: $!\n", 1); - mkdir("$confdir/$config/index", $def_perm) || - &log_and_die ("ERROR: mkdir: $confdir/$config/index failed: $!\n", 1); + mkpath("$confdir/$config/curinfo", $def_perm) || + &log_and_die ("ERROR: mkpath: $confdir/$config/curinfo failed: $!\n", 1); + mkpath("$confdir/$config/index", $def_perm) || + &log_and_die ("ERROR: mkpath: $confdir/$config/index failed: $!\n", 1); &mprint ("curinfo and index directory created\n"); } @@ -208,23 +203,23 @@ sub create_holding { if (( $dfout[10] / $div ) > 1024000 ) { # holding disk is defined 1000 MB &mprint ("creating holding disk directory\n"); unless ( -d "$amandahomedir/holdings" ) { - mkdir ( "$amandahomedir/holdings", $def_perm) || - (&mprint ("WARNING: mkdir $amandahomedir/holdings failed: $!\n"), $holding_err++, return ); + mkpath ( "$amandahomedir/holdings", $def_perm) || + (&mprint ("WARNING: mkpath $amandahomedir/holdings failed: $!\n"), $holding_err++, return ); } - mkdir ( "$amandahomedir/holdings/$config", $def_perm) || - (&mprint ("WARNING: mkdir $amandahomedir/holdings/$config failed: $!\n"), $holding_err++, return) ; + mkpath ( "$amandahomedir/holdings/$config", $def_perm) || + (&mprint ("WARNING: mkpath $amandahomedir/holdings/$config failed: $!\n"), $holding_err++, return) ; } } #create default tape dir sub create_deftapedir{ unless ( -e "$amandahomedir/vtapes" ) { - mkdir ( "$amandahomedir/vtapes", $def_perm) || - ( &mprint ("WARNING: mkdir $amandahomedir/$config/vtapes failed: $!\n"), return ); + mkpath ( "$amandahomedir/vtapes", $def_perm) || + ( &mprint ("WARNING: mkpath $amandahomedir/$config/vtapes failed: $!\n"), return ); } unless ( -e "$amandahomedir/vtapes/$config" ) { - mkdir ( "$amandahomedir/vtapes/$config", $def_perm) || - ( &mprint ("WARNING: mkdir $amandahomedir/vtapes/$config failed: $!\n"), return ); + mkpath ( "$amandahomedir/vtapes/$config", $def_perm) || + ( &mprint ("WARNING: mkpath $amandahomedir/vtapes/$config failed: $!\n"), return ); } $parentdir="$amandahomedir/vtapes/$config"; } @@ -235,11 +230,10 @@ sub create_vtape { if ($template_only==0){ # check $template mode $mylabelprefix=$labelstr; #set labelstr if ($tapedev eq "$def_tapedev/$config"){ - &create_deftapedir; + &create_deftapedir; } else { - $tapedev=~/^(file:\/)/; - $parentdir=$'; + $parentdir=$tapedev; } } else { @@ -260,15 +254,16 @@ sub create_vtape { if (defined $tapecycle) { $tapecycle=~/^\d+/; $tp_cyclelimit=$&; - # check space - my $dfout =`df $parentdir`; - my $mul=1024; - @dfdata=split(" ",$dfout); - unless ( $dfdata[1] eq "1K-blocks" ) { - $mul=512; # 512-blocks displayed by df - } - if (($dfdata[10]*$mul) < (($tp_cyclelimit*73728)+10240)){ - &mprint ("WARNING: Not enough space for vtapes. Creation of vtapes failed\n"); + + # check space + my $fsinfo = Amanda::Util::get_fs_usage($parentdir); + my $avail_bytes = $fsinfo->{'blocksize'} * $fsinfo->{'bavail'}; + + # mysteriously, we need at least 72k per slot, plus 10k overhead. The + # origin of these numbers is unknown. + my $needed_bytes = (($tp_cyclelimit*73728)+10240); + if ($avail_bytes < $needed_bytes){ + &mprint ("WARNING: Not enough space for vtapes. Need 72k per slot plus 10k ($needed_bytes bytes); have $avail_bytes available. Creation of vtapes failed\n"); $vtape_err++; return; } @@ -279,11 +274,11 @@ sub create_vtape { for $i (1..$tp_cyclelimit) { unless ( -e "slot$i"){ - mkdir ("slot$i", $def_perm) || - ( &mprint ("WARNING: mkdir $parentdir/slot$i failed: $!\n"), $vtape_err++, return); + mkpath ("slot$i", $def_perm) || + ( &mprint ("WARNING: mkpath $parentdir/slot$i failed: $!\n"), $vtape_err++, return); } ( @amlabel_out = `$sbindir/amlabel -f $config $mylabelprefix-$i slot $i`) || - ( &mprint ("WARNING: amlabel vtapes failed at slot $i: $!\n"), $vtape_err++, return); + ( &mprint ("WARNING: amlabel vtapes failed at slot $i: $!\n"), $vtape_err++, return); } foreach (@amlabel_out) { print LOG; @@ -315,56 +310,63 @@ sub create_customconf{ $labelstr="^$config-[0-9][0-9]*\$"; } } + + open (CONF, ">$confdir/$config/amanda.conf") || + &log_and_die ("ERROR: Cannot create amanda.conf file: $!\n", 1); + chmod ($amanda_conf_perm, "$confdir/$config/amanda.conf") || + &log_and_die ("ERROR: Cannot set amanda.conf file access permission: $!\n", 1); + + print CONF "org \"$config\"\t\t# your organization name for reports\n"; + print CONF "dumpuser \"$dumpuser\"\t# the user to run dumps under\n"; + print CONF "mailto \"$mailto\"\t# space separated list of operators at your site\n"; + print CONF "dumpcycle $dumpcycle\t\t# the number of days in the normal dump cycle\n"; + print CONF "runspercycle $runspercycle\t\t# the number of amdump runs in dumpcycle days\n"; + print CONF "tapecycle $tapecycle\t# the number of tapes in rotation\n"; + print CONF "runtapes $runtapes\t\t# number of tapes to be used in a single run of amdump\n"; + if ((!(defined($template)))||($template eq "harddisk")) { - if (defined $tapedev){ - $tapedev="file:/".$tapedev; - } - unless ( $tpchanger ) { $tpchanger="chg-disk"; } - unless ( $tapedev ) { $tapedev="$def_tapedev/$config"; } - unless ( $changerfile ) { $changerfile="$confdir/$config/changer.conf"; } - unless ( $changerdev ) { $changerdev="/dev/null";} + print CONF "\n"; + print CONF "define changer my_vtapes {\n"; + print CONF " tpchanger \"chg-disk:$tapedev\"\n"; + print CONF " property \"num-slot\" \"10\"\n"; + print CONF " property \"auto-create-slot\" \"yes\"\n"; + print CONF "}\n"; + print CONF "tpchanger \"my_vtapes\"\n\n"; unless ( $tapetype ) { $tapetype="HARDDISK"; } } elsif ($template eq "single-tape") { - unless ($tpchanger) {$tpchanger="chg-manual";} - unless ($tapedev) {$tapedev="/dev/nst0";} - unless ($changerfile) {$changerfile="$confdir/$config/chg-manual.conf";} - unless ($changerdev) {$changerdev="/dev/null";} + print CONF "\n"; + print CONF "define changer my_single {\n"; + print CONF " tpchanger \"chg-single:$tapedev\"\n"; + print CONF "}\n"; + print CONF "tpchanger \"my_single\"\n\n"; unless ($tapetype) {$tapetype="HP-DAT";} } elsif ($template eq "tape-changer") { - unless ($tpchanger){$tpchanger="chg-zd-mtx";} - unless ($tapedev){ $tapedev="/dev/nst0";} - unless ($changerfile){$changerfile="$confdir/$config/changer.conf";} - unless ($changerdev) {$changerdev="/dev/sg1";} + print CONF "\n"; + print CONF "define changer my_robot {\n"; + print CONF " tpchanger \"chg-robot:$changerdev\"\n"; + print CONF " property \"tape-device\" \"0=$tapedev\"\n"; + print CONF "}\n"; + print CONF "tpchanger \"my_robot\"\n\n"; unless ($tapetype) {$tapetype="HP-DAT";} } else # S3 case { - unless ($tpchanger){$tpchanger="chg-multi";} - unless ($changerfile){$changerfile="$confdir/$config/changer.conf";} + print CONF "\n"; + print CONF "define changer my_s3 {\n"; + print CONF " tpchanger \"chg-multi:$tapedev\"\n"; + print CONF " device-property \"S3_ACCESS_KEY\" \"\"\n"; + print CONF " device-property \"S3_SECRET_KEY\" \"\"\n"; + print CONF " device-property \"NB_THREADS_BACKUP\" \"\"\n"; + print CONF "}\n"; + print CONF "tpchanger \"my_s3\"\n\n"; unless ($tapetype) {$tapetype="HP-DAT";} } - - open (CONF, ">$confdir/$config/amanda.conf") || - &log_and_die ("ERROR: Cannot create amanda.conf file: $!\n", 1); - chmod ($amanda_conf_perm, "$confdir/$config/amanda.conf") || - &log_and_die ("ERROR: Cannot set amanda.conf file access permission: $!\n", 1); - - print CONF "org \"$config\"\t\t# your organization name for reports\n"; - print CONF "mailto \"$mailto\"\t# space separated list of operators at your site\n"; - print CONF "dumpcycle $dumpcycle\t\t# the number of days in the normal dump cycle\n"; - print CONF "runspercycle $runspercycle\t\t# the number of amdump runs in dumpcycle days\n"; - print CONF "tapecycle $tapecycle\t# the number of tapes in rotation\n"; - print CONF "runtapes $runtapes\t\t# number of tapes to be used in a single run of amdump\n"; - print CONF "tpchanger \"$tpchanger\"\t# the tape-changer glue script\n"; - print CONF "tapedev \"$tapedev\"\t# the no-rewind tape device\n"; - print CONF "changerfile \"$changerfile\"\t# tape changer configuration parameter file\n"; - print CONF "changerdev \"$changerdev\"\t# tape changer configuration parameter device\n"; print CONF "tapetype $tapetype\t# what kind of tape it is\n"; print CONF "labelstr \"$labelstr\"\t# label constraint regex: all tapes must match\n"; print CONF "dtimeout $def_dtimeout\t# number of idle seconds before a dump is aborted\n"; @@ -414,7 +416,7 @@ sub build_amanda_ssh_key{ } close NEWAUTH; close PUB; - &mprint("$amandahomedir/.ssh/client_authorized_keys created. Please append to /var/lib/amanda/.ssh/authorized_keys file on Amanda clients\n"); + &mprint("$amandahomedir/.ssh/client_authorized_keys created. Please append to $amandahomedir/.ssh/authorized_keys file on Amanda clients\n"); } } } @@ -479,10 +481,12 @@ $date=`date +%Y%m%d%H%M%S`; chomp($date); my $logfile="$tmpdir/amserverconfig.$date.debug"; -&is_user_right; +Amanda::Util::setup_application("amserverconfig", "server", $CONTEXT_CMDLINE); +Amanda::Util::finish_setup($RUNNING_AS_ANY); + unless ( -e "$tmpdir" ) { - mkdir ("$tmpdir", $def_perm) || - die ("ERROR: mkdir: $tmpdir failed: $!\n"); + mkpath ("$tmpdir", $def_perm) || + die ("ERROR: mkpath: $tmpdir failed: $!\n"); } open (LOG, ">$logfile") || die ("ERROR: Cannot create logfile: $!\n"); @@ -655,3 +659,4 @@ $ENV{'PATH'} = $oldPATH; # THE END +Amanda::Util::finish_application();