* Added German translation, provided by Manfred Herrmann.
[BackupPC.git] / bin / BackupPC
index 964640e..d18bcef 100755 (executable)
@@ -47,7 +47,7 @@
 #
 #========================================================================
 #
-# Version 1.6.0_CVS, released 10 Dec 2002.
+# Version 2.0.0beta1, released 30 Mar 2003.
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -70,8 +70,7 @@ use Digest::MD5;
 # Handle command line options
 ###########################################################################
 my %opts;
-getopts("d", \%opts);
-if ( @ARGV != 0 ) {
+if ( !getopts("d", \%opts) || @ARGV != 0 ) {
     print("usage: $0 [-d]\n");
     exit(1);
 }
@@ -249,8 +248,8 @@ sub Main_Initialize
         exit(1);
     }
     foreach my $progName ( qw(SmbClientPath NmbLookupPath PingPath DfPath
-                              SendmailPath) ) {
-        next if ( !defined($Conf{$progName}) || -x $Conf{$progName} );
+                              SendmailPath SshPath) ) {
+        next if ( $Conf{$progName} eq "" || -x $Conf{$progName} );
         print(STDERR $bpc->timeStamp,
                      "\$Conf{$progName} = '$Conf{$progName}' is not a"
                    . " valid executable program\n");
@@ -325,7 +324,7 @@ sub Main_Initialize
     # Write out our initial status and save our PID
     #
     StatusWrite();
-    if ( open(PID, ">$TopDir/log/BackupPC.pid") ) {
+    if ( open(PID, ">", "$TopDir/log/BackupPC.pid") ) {
         print(PID $$);
         close(PID);
     }
@@ -364,7 +363,7 @@ sub Main_TryToRun_nightly
                host    => $bpc->trashJob,
                user    => "BackupPC",
                reqTime => time,
-               cmd     => "$BinDir/BackupPC_trashClean"
+               cmd     => ["$BinDir/BackupPC_trashClean"],
            });
        $CmdQueueOn{$bpc->trashJob} = 1;
     }
@@ -373,7 +372,7 @@ sub Main_TryToRun_nightly
                host    => $bpc->adminJob,
                user    => "BackupPC",
                reqTime => time,
-               cmd     => "$BinDir/BackupPC_nightly"
+               cmd     => ["$BinDir/BackupPC_nightly"],
            });
        $CmdQueueOn{$bpc->adminJob} = 1;
        $RunNightlyWhenIdle = 2;
@@ -420,8 +419,8 @@ sub Main_TryToRun_CmdQueue
         }
         if ( !$pid ) {
             setpgrp 0,0;
-            exec($cmd);
-            print(LOG $bpc->timeStamp, "can't exec $cmd for $host\n");
+            exec(@$cmd);
+            print(LOG $bpc->timeStamp, "can't exec @$cmd for $host\n");
             exit(0);
         }
         $Jobs{$host}{pid}       = $pid;
@@ -430,6 +429,7 @@ sub Main_TryToRun_CmdQueue
         vec($FDread, $Jobs{$host}{fn}, 1) = 1;
         $Jobs{$host}{startTime} = time;
         $Jobs{$host}{reqTime}   = $req->{reqTime};
+       $cmd                    = join(" ", @$cmd);
         $Jobs{$host}{cmd}       = $cmd;
         $Jobs{$host}{type}      = $Status{$host}{type};
         $Status{$host}{state}   = "Status_link_running";
@@ -560,7 +560,7 @@ sub Main_TryToRun_Bg_or_User_Queue
         vec($FDread, $Jobs{$host}{fn}, 1) = 1;
         $Jobs{$host}{startTime}  = time;
         $Jobs{$host}{reqTime}    = $req->{reqTime};
-        $Jobs{$host}{cmd}        = "$progName " . join(" ", @args);
+        $Jobs{$host}{cmd}        = join(" ", $progName, @args);
         $Jobs{$host}{user}       = $user;
         $Jobs{$host}{type}       = $type;
         if ( !$req->{dhcp} ) {
@@ -775,7 +775,7 @@ sub Main_Check_Job_Messages
             $Jobs{$host}{mesg} = $2;
             if ( $Jobs{$host}{dhcp} ) {
                 if ( $mesg =~ /^DHCP (\S+) (\S+)/ ) {
-                    my $newHost = $2;
+                    my $newHost = $bpc->uriUnesc($2);
                     if ( defined($Jobs{$newHost}) ) {
                         print(LOG $bpc->timeStamp,
                                 "Backup on $newHost is already running\n");
@@ -796,16 +796,11 @@ sub Main_Check_Job_Messages
                 } else {
                     print(LOG $bpc->timeStamp, "dhcp $host: $mesg\n");
                 }
-            } elsif ( $mesg =~ /^started (.*) dump, pid=(-?\d+), tarPid=(-?\d+), share=(.*)/ ) {
+            } elsif ( $mesg =~ /^started (.*) dump, share=(.*)/ ) {
                 $Jobs{$host}{type}      = $1;
-                $Jobs{$host}{xferPid}   = $2;
-                $Jobs{$host}{tarPid}    = $3;
-                $Jobs{$host}{shareName} = $4;
+                $Jobs{$host}{shareName} = $2;
                 print(LOG $bpc->timeStamp,
-                          "Started $1 backup on $host"
-                          . " (pid=$Jobs{$host}{pid}, xferPid=$2",
-                          $Jobs{$host}{tarPid} > 0
-                                ? ", tarPid=$Jobs{$host}{tarPid}" : "",
+                          "Started $1 backup on $host (pid=$Jobs{$host}{pid}",
                           $Jobs{$host}{dhcpHostIP}
                                 ? ", dhcp=$Jobs{$host}{dhcpHostIP}" : "",
                           ", share=$Jobs{$host}{shareName})\n");
@@ -817,16 +812,13 @@ sub Main_Check_Job_Messages
                 $Status{$host}{aliveCnt}++;
                 $Status{$host}{dhcpCheckCnt}--
                                 if ( $Status{$host}{dhcpCheckCnt} > 0 );
-            } elsif ( $mesg =~ /^started_restore (\S+) (\S+)/ ) {
-                $Jobs{$host}{type}    = "restore";
+            } elsif ( $mesg =~ /^xferPids (.*)/ ) {
                 $Jobs{$host}{xferPid} = $1;
-                $Jobs{$host}{tarPid}  = $2;
+            } elsif ( $mesg =~ /^started_restore/ ) {
+                $Jobs{$host}{type}    = "restore";
                 print(LOG $bpc->timeStamp,
                           "Started restore on $host"
-                          . " (pid=$Jobs{$host}{pid}, xferPid=$2",
-                          $Jobs{$host}{tarPid} > 0
-                                ? ", tarPid=$Jobs{$host}{tarPid}" : "",
-                          ")\n");
+                          . " (pid=$Jobs{$host}{pid})\n");
                 $Status{$host}{state}     = "Status_restore_in_progress";
                 $Status{$host}{reason}    = "";
                 $Status{$host}{type}      = "restore";
@@ -1014,17 +1006,24 @@ sub Main_Check_Client_Messages
                 $host = $1;
                 my $user = $2;
                 my $backoff = $3;
+               $host = $bpc->uriUnesc($host);
                 if ( $CmdJob ne $host && defined($Status{$host})
                                       && defined($Jobs{$host}) ) {
                     print(LOG $bpc->timeStamp,
                                "Stopping current backup of $host,"
                              . " request by $user (backoff=$backoff)\n");
                     kill(2, $Jobs{$host}{pid});
-                    vec($FDread, $Jobs{$host}{fn}, 1) = 0;
-                    close($Jobs{$host}{fh});
-                    delete($Jobs{$host});
+                   #
+                   # Don't close the pipe now; wait until the child
+                   # really exits later.  Otherwise close() will
+                   # block until the child has exited.
+                   #  old code:
+                    ##vec($FDread, $Jobs{$host}{fn}, 1) = 0;
+                    ##close($Jobs{$host}{fh});
+                    ##delete($Jobs{$host});
+
                     $Status{$host}{state}     = "Status_idle";
-                    $Status{$host}{reason}    = "Reason_backup_canceled_by_user"; #FIXME: user should be $user (we need to substitute the variable in the l10n stuff)
+                    $Status{$host}{reason}    = "Reason_backup_canceled_by_user";
                     $Status{$host}{activeJob} = 0;
                     $Status{$host}{startTime} = time;
                     $reply = "ok: backup of $host cancelled";
@@ -1053,9 +1052,11 @@ sub Main_Check_Client_Messages
                 QueueAllPCs();
             } elsif ( $cmd =~ /^backup (\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ ) {
                 my $hostIP = $1;
-                $host = $2;
-                my $user = $3;
+                $host      = $2;
+                my $user   = $3;
                 my $doFull = $4;
+               $host      = $bpc->uriUnesc($host);
+               $hostIP    = $bpc->uriUnesc($hostIP);
                 if ( !defined($Status{$host}) ) {
                     print(LOG $bpc->timeStamp,
                                "User $user requested backup of unknown host"
@@ -1094,6 +1095,8 @@ sub Main_Check_Client_Messages
                 $host      = $2;
                 my $user   = $3;
                 my $reqFileName = $4;
+               $host      = $bpc->uriUnesc($host);
+               $hostIP    = $bpc->uriUnesc($hostIP);
                 if ( !defined($Status{$host}) ) {
                     print(LOG $bpc->timeStamp,
                                "User $user requested restore to unknown host"
@@ -1143,15 +1146,20 @@ sub Main_Check_Client_Messages
                     } elsif ( $type =~ /^hosts/ ) {
                         push(@values,  \%Status);
                         push(@names, qw(*Status));
-                    } elsif ( $type =~ /^host\((.*)\)/
-                                        && defined($Status{$1}) ) {
-                        push(@values,  {
-                                %{$Status{$1}},
-                                BgQueueOn => $BgQueueOn{$1},
-                                UserQueueOn => $UserQueueOn{$1},
-                                CmdQueueOn => $CmdQueueOn{$1},
-                            });
-                        push(@names, qw(*StatusHost));
+                    } elsif ( $type =~ /^host\((.*)\)/ ) {
+                       my $h = $bpc->uriUnesc($1);
+                        if ( defined($Status{$h}) ) {
+                            push(@values,  {
+                                    %{$Status{$h}},
+                                    BgQueueOn => $BgQueueOn{$h},
+                                    UserQueueOn => $UserQueueOn{$h},
+                                    CmdQueueOn => $CmdQueueOn{$h},
+                                });
+                            push(@names, qw(*StatusHost));
+                        } else {
+                            print(LOG $bpc->timeStamp,
+                                      "Unknown host $h for status request\n");
+                        }
                     } else {
                         print(LOG $bpc->timeStamp,
                                   "Unknown status request $type\n");
@@ -1162,6 +1170,7 @@ sub Main_Check_Client_Messages
                 $reply = $dump->Dump;
             } elsif ( $cmd =~ /^link\s+(.+)/ ) {
                 my($host) = $1;
+               $host = $bpc->uriUnesc($host);
                 QueueLink($host);
             } elsif ( $cmd =~ /^log\s+(.*)/ ) {
                 print(LOG $bpc->timeStamp, "$1\n");
@@ -1255,7 +1264,7 @@ sub StatusWrite
              [  \%Info, \%Status],
              [qw(*Info   *Status)]);
     $dump->Indent(1);
-    if ( open(STATUS, ">$TopDir/log/status.pl") ) {
+    if ( open(STATUS, ">", "$TopDir/log/status.pl") ) {
         print(STATUS $dump->Dump);
         close(STATUS);
     }
@@ -1335,7 +1344,7 @@ sub QueueLink
             host    => $host,
             user    => "BackupPC",
             reqTime => time,
-            cmd     => "$BinDir/BackupPC_link $host"
+            cmd     => ["$BinDir/BackupPC_link",  $host],
         });
     $CmdQueueOn{$host} = 1;
 }