diff --git a/ChangeLog b/ChangeLog
index 295613d648b0d8c9ef291f438943505a04d86667..a9ae794d30e8be79fecd3abb5944af627a526c6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2006-11-29  Per Cederqvist  <ceder@sedesopim.lysator.liu.se>
+
+	Guard against running two fetch-backup-work instances at the same
+	time, and have the operator confirm any changes it finds.
+	* fetch-backup-work: Atomically replace the list of backup tasks.
+	Ask for confirmation before doing so.
+
+	Don't backup snes9x-rediffbackup.
+	* fetch-backup-work: Don't back up snes9x-rediffbackup, which
+	seems to be an old backup in itself.
+
+	Back up ftp-pub and medreg.
+	* fetch-backup-work: Back up and / ftp-pub from hanna, and an
+	sqldump of medreg from wrath.
+	* backup-one-task: wrath uses rdiff-backup stored in /usr/bin.
+
+	Added support for the --new option, which only runs backup jobs
+	that have never completed.
+	* backup-all: New option: --new.
+	* backup-one-task: New option: --new.  
+
 2006-11-15  Per Cederqvist  <ceder@sedesopim.lysator.liu.se>
 
 	Back up lyssvn.
diff --git a/backup-all b/backup-all
index 7d21088fd805762d92ed421950a753797ba084ff..e1c6162e4243cacc14dd43982215e73f2c09230f 100755
--- a/backup-all
+++ b/backup-all
@@ -1,11 +1,15 @@
 #!/bin/sh
 
 usage () {
-  echo $0: usage: $0 '[ --failed | --retry ] partno...' >&2
+  echo $0: usage: $0 '[ options ] partno...' >&2
+  echo ' --failed   Only run backup jobs that failed.' >&2
+  echo ' --retry    Only run backup jobs that produced warnings.' >&2
+  echo ' --new      Only run backup jobs that have never completed.' >&2
 }
 
 failed=
 retry=
+new=
 
 while true
 do
@@ -16,6 +20,9 @@ do
     x--retry)
       shift
       retry=--retry;;
+    x--new)
+      shift
+      new=--new;;
     x--*)
       usage
       exit 1;;
@@ -81,7 +88,7 @@ do
     fi
 
     /nobackup/backup.lysator/bin/backup-one-task \
-      $failed $retry \
+      $failed $retry $new \
       $lysrdiffpart "$category" "$subcategory" "$server" "$serverpath" \
       "$ctr/$total $category $subcategory"
     ctr=`expr $ctr + 1`
diff --git a/backup-one-task b/backup-one-task
index d19eba44f8a7a32587fedccffc9d75aa6b1ffa99..734bd8787ef85042b8da33a1079de8a88024007e 100755
--- a/backup-one-task
+++ b/backup-one-task
@@ -6,10 +6,12 @@ usage () {
     echo Recognized options: >&2
     echo ' --failed     Only run failed backups' >&2
     echo ' --retry      Only run backups with output from rdiff-backup' >&2
+    echo ' --new        Only run backups that never completed' >&2
 }
 
 failed=0
 retry=0
+new=0
 
 while [ $# -gt 1 ]
 do
@@ -20,6 +22,9 @@ do
     x--retry)
       shift
       retry=1;;
+    x--new)
+      shift
+      new=1;;
     x--*)
       usage
       exit 1;;
@@ -41,6 +46,7 @@ serverpath="$5"
 msg="$6"
 
 case "$server" in
+    wrath) remoterdiff=/usr/bin/rdiff-backup;;
     manhattan) remoterdiff=/usr/bin/rdiff-backup;;
     sedesopim) remoterdiff=/usr/bin/rdiff-backup;;
     home) remoterdiff=/usr/local/bin/rdiff-backup;;
@@ -69,6 +75,12 @@ then
     exit 0
 fi
 
+if [ $new = 1 ] && [ -f "$statebase"-end ]
+then
+    rmdir "$lockdir"
+    exit 0
+fi
+
 if [ $retry = 1 ] && [ "`(wc -c < \"$rdifflogfile\") 2>/dev/null`" = 0 ]
 then
     rmdir "$lockdir"
diff --git a/fetch-backup-work b/fetch-backup-work
index ae6d957e39856643878c840899409caeef56883b..1f56e6a94d440a1a361c561789788acbde86e6cc 100755
--- a/fetch-backup-work
+++ b/fetch-backup-work
@@ -1,18 +1,21 @@
 #!/bin/sh
 
-rm /nobackup/backup.lysator/var/tasks
+TASKS=/nobackup/backup.lysator/var/tasks
+NT=$TASKS.tmp
+
+rm -f $NT
 
 ssh stalingrad ls -1 /svnroot \
  | sort \
  | awk '$1 == "lost+found" { next }
         {print "lsvn", $1, "stalingrad /svnroot/" $1}' \
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
 ssh stalingrad ls -1 /cvsroot \
  | sort \
  | awk '$1 == "lost+found" { next }
         {print "lyscvs", $1, "stalingrad /cvsroot/" $1}' \
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
 ssh uhumhummy ls -1 /lysator/lyswww/users/common \
  | grep -v USAGE \
@@ -20,12 +23,12 @@ ssh uhumhummy ls -1 /lysator/lyswww/users/common \
  | grep -v '^cap\.fm$' \
  | sort \
  | awk '{print "lyswww", $1, "uhumhummy /lysator/lyswww/users/common/" $1}' \
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
 ssh uhumhummy ls -1 /lysator/lyswww/users/roxen_only \
  | sort \
  | awk '{print "roxen", $1, "uhumhummy /lysator/lyswww/users/roxen_only/" $1}'\
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
 ssh nema.lysator.liu.se ypcat -k auto_home \
  | sort \
@@ -57,18 +60,31 @@ ssh nema.lysator.liu.se ypcat -k auto_home \
         $1 == "sge" { next }
 	{ print }' \
  | sed 's/^/home /' \
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
 echo lyskom kom compulsion /export/mdsk2/sw_lyskom_compulsion \
->> /nobackup/backup.lysator/var/tasks
+>> $NT
 
-echo sedesopim var sedesopim /var >> /nobackup/backup.lysator/var/tasks
-echo sedesopim home sedesopim /home >> /nobackup/backup.lysator/var/tasks
-echo sedesopim root sedesopim / >> /nobackup/backup.lysator/var/tasks
-echo sedesopim boot sedesopim /boot >> /nobackup/backup.lysator/var/tasks
+echo sedesopim var sedesopim /var >> $NT
+echo sedesopim home sedesopim /home >> $NT
+echo sedesopim root sedesopim / >> $NT
+echo sedesopim boot sedesopim /boot >> $NT
 
-echo poseidon var poseidon /var >> /nobackup/backup.lysator/var/tasks
-echo poseidon root poseidon /root >> /nobackup/backup.lysator/var/tasks
-ssh poseidon 'cd /var/repositories && ls -1 | while read d ; do [ -d "$d" ] && echo "$d" ; done' \
+echo poseidon var poseidon /var >> $NT
+echo poseidon root poseidon /root >> $NT
+ssh poseidon 'cd /var/repositories && ls -1 | while read d ; do [ -d "$d" ] && [ ! -L "$d" ] && echo "$d" ; done' \
+| grep -v '^snes9x-rediffbackup$' \
 | awk '{ print "lyssvn", $1, "poseidon", "/var/repositories/" $1 }' \
-| sort >> /nobackup/backup.lysator/var/tasks
+| sort >> $NT
+
+echo hanna root hanna / >> $NT
+ssh hanna 'cd /export/hanna/ftp/pub && ls -1 | while read d ; do [ -d "$d" ] && [ ! -L "$d" ] && echo "$d" ; done' \
+| awk '{ print "ftp-pub", $1, "hanna", "/export/hanna/ftp/pub/" $1 }' \
+| sort >> $NT
+
+echo medreg sqldump wrath /var/lib/mysql-dump >> $NT
+
+diff -u $TASKS $NT
+echo -n '[CONFIRM] '
+read line
+mv -f $NT $TASKS