lintian doesn't like orphan packages with uploaders...
[debian/amanda] / server-src / amserverconfig.pl
index ec8675fcc0e25d41676c1d84ef57937a1403a06a..919c71072f2f7a05770c85d20fe84278b4966531 100755 (executable)
@@ -1,10 +1,11 @@
 #!@PERL@
 #
-# Copyright (c) 2005-2008 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
@@ -15,7 +16,7 @@
 # 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
+# Contact information: Zmanda Inc, 465 S. Mathilda Ave., Suite 300
 # Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
 #
 
@@ -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,17 +50,13 @@ my $holding_err=0;
 my $template_only=0;
 my $parentdir;
 my $host;
-# Get the version suffix.
-my $USE_VERSION_SUFFIXES = '@USE_VERSION_SUFFIXES@';
-my $suf = '';
-if ( $USE_VERSION_SUFFIXES =~ /^yes$/i ) {
-        $suf='-@VERSION@';
-}
+my @pw = getpwuid($<);
+my $dumpuser = $pw[0];
 
 
 #usage
 sub usage {
-        print "$0 $suf\n";
+        print "$0\n";
         print "\t\t <config> [--template <template>]\n";
        print "\t\t[--no-vtape] (do not create virtual tapes)\n";
         print "\t\t[--tapetype <tapetype>] [--tpchanger <tpchanger>]\n";
@@ -110,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");
   }
 }
@@ -169,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");
 }
 
@@ -214,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";
 }
@@ -241,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 {
@@ -266,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;
                }
@@ -285,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;
@@ -321,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";
@@ -420,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");
       }
   }
 }
@@ -485,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");
@@ -661,3 +659,4 @@ $ENV{'PATH'} = $oldPATH;
 
 
 # THE END
+Amanda::Util::finish_application();