tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: [PATCH] dump -U to specify dumpdates device
On Wed, Mar 20, 2019 at 04:20:09PM +0000, David Holland wrote:
> I have been meaning sometime to hack dump to allow using dumpdates
> with subtree or partial-volume dumps, which requires something like
> this as a prereq, so yes please.
Here is the -U flag patch augmented with a -H hash_pattern option,
which lets you partitionize given files-to-dump. Here is an example:
dump -H '[0123]*' -f dump0123 /data/*
dump -H '[4567]*' -f dump4567 /data/*
dump -H '[89ab]*' -f dump89ab /data/*
dump -H '[cdef]*' -f dumpcdef /data/*
It would make my backups scripts simplier, but it may be too
much specialized. What do you think?
Index: dump.8
===================================================================
RCS file: /cvsroot/src/sbin/dump/dump.8,v
retrieving revision 1.69
diff -U4 -r1.69 dump.8
--- dump.8 15 Jul 2018 06:14:13 -0000 1.69
+++ dump.8 21 Mar 2019 13:03:34 -0000
@@ -43,15 +43,17 @@
.Op Fl B Ar records
.Op Fl b Ar blocksize
.Op Fl d Ar density
.Op Fl f Ar file
+.Op Fl H Ar hash_pattern
.Op Fl h Ar level
.Op Fl k Ar read-blocksize
.Op Fl L Ar label
.Op Fl l Ar timeout
.Op Fl r Ar cachesize
.Op Fl s Ar feet
.Op Fl T Ar date
+.Op Fl U Ar dumpdev
.Op Fl x Ar snap-backup
.Ar files-to-dump
.Nm
.Op Fl W Li \&| Fl w
@@ -187,8 +189,19 @@
.Ev RCMD_CMD .
See
.Xr rcmd 3
for more details.
+.It Fl H Ar hash_pattern
+Within the list of given
+.Ar files-to-dump
+only dump the one whose name's SHA1 match
+.Ar hash_pattern
+pattern. This is usefull to perform partial dumps. Here is an example
+to dump one quarter of paths matching
+.Pa /home/*
+.Bd -literal -offset indent
+/sbin/dump -0f /dev/nrst1 -H '[0123]*' /home/*
+.Ed
.It Fl h Ar level
Honor the user
.Qq nodump
flag
@@ -298,12 +311,24 @@
The file
.Pa /etc/dumpdates
may be edited to change any of the fields,
if necessary.
-If a list of files or subdirectories is being dumped
+If the
+.Fl T
+option is used or if a list of files or subdirectories is being dumped
(as opposed to an entire file system), then
.Fl u
is ignored.
+.It Fl U Ar dumpdev
+Same as
+.Fl u
+but specifies the device in
+.Pa /etc/dumpdates
+as
+.Ar dumpdev .
+This option can be used with subdir dumps and with the
+.Fl T
+option.
.It Fl W
.Nm
tells the operator what file systems need to be dumped.
This information is gleaned from the files
Index: dump.h
===================================================================
RCS file: /cvsroot/src/sbin/dump/dump.h,v
retrieving revision 1.56
diff -U4 -r1.56 dump.h
--- dump.h 1 Mar 2019 16:42:11 -0000 1.56
+++ dump.h 21 Mar 2019 13:03:34 -0000
@@ -114,8 +114,9 @@
const char *temp; /* name of the file for doing rewrite of dumpdates */
char lastlevel; /* dump level of previous dump */
char level; /* dump level of this dump */
int uflag; /* update flag */
+const char *dumpdev; /* device name in dumpdates */
int eflag; /* eject flag */
int lflag; /* autoload flag */
int diskfd; /* disk file descriptor */
int tapefd; /* tape file descriptor */
Index: itime.c
===================================================================
RCS file: /cvsroot/src/sbin/dump/itime.c,v
retrieving revision 1.21
diff -U4 -r1.21 itime.c
--- itime.c 1 Mar 2019 16:42:11 -0000 1.21
+++ itime.c 21 Mar 2019 13:03:34 -0000
@@ -128,11 +128,11 @@
getdumptime(void)
{
struct dumpdates *ddp;
int i;
- char *fname;
+ const char *fname;
- fname = disk;
+ fname = dumpdev ? dumpdev : disk;
#ifdef FDEBUG
msg("Looking for name %s in dumpdates = %s for level = %c\n",
fname, dumpdates, level);
#endif
@@ -169,17 +169,17 @@
FILE *df;
struct dumpdates *dtwalk, *dtfound;
int i;
int fd;
- char *fname;
+ const char *fname;
- if(uflag == 0)
+ if(uflag == 0 && dumpdev == NULL)
return;
if ((df = fopen(dumpdates, "r+")) == NULL)
quite(errno, "cannot rewrite %s", dumpdates);
fd = fileno(df);
(void) flock(fd, LOCK_EX);
- fname = disk;
+ fname = dumpdev ? dumpdev : disk;
free((char *)ddatev);
ddatev = 0;
nddates = 0;
readdumptimes(df);
Index: main.c
===================================================================
RCS file: /cvsroot/src/sbin/dump/main.c,v
retrieving revision 1.74
diff -U4 -r1.74 main.c
--- main.c 1 Mar 2019 16:42:11 -0000 1.74
+++ main.c 21 Mar 2019 13:03:34 -0000
@@ -55,9 +55,11 @@
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <fnmatch.h>
#include <fstab.h>
+#include <sha1.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -102,8 +104,9 @@
int snap_internal = 0;
ino_t maxino;
time_t tnow, date;
int dirc;
+ char *hash_pattern = NULL;
char *mountpoint;
int just_estimate = 0;
char labelstr[LBLSIZE];
char buf[MAXPATHLEN], rbuf[MAXPATHLEN];
@@ -132,9 +135,9 @@
usage();
obsolete(&argc, &argv);
while ((ch = getopt(argc, argv,
- "0123456789aB:b:cd:eFf:h:ik:l:L:nr:s:StT:uWwx:X")) != -1)
+ "0123456789aB:b:cd:eFf:H:h:ik:l:L:nr:s:StT:uU:Wwx:X")) != -1)
switch (ch) {
/* dump level */
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
@@ -175,8 +178,11 @@
case 'f': /* output file */
tape = optarg;
break;
+ case 'H': /* file to dump hash pattern */
+ hash_pattern = optarg;
+ break;
case 'h':
honorlevel = numarg("honor level", 0L, 10L);
break;
@@ -244,8 +250,12 @@
case 'u': /* update /etc/dumpdates */
uflag = 1;
break;
+ case 'U': /* dump device in /etc/dumpdates */
+ dumpdev = optarg;
+ break;
+
case 'W': /* what to do */
case 'w':
lastdump(ch);
exit(X_FINOK); /* do nothing else */
@@ -319,8 +329,24 @@
} else {
if (strcmp(mountpoint, fsbuf.f_mntonname) != 0)
quit("%s is not on %s", argv[i], mountpoint);
}
+
+ if (hash_pattern) {
+ char hash[SHA1_DIGEST_STRING_LENGTH];
+ uint8_t *arg = (uint8_t *)argv[i];
+ int j;
+
+ (void)SHA1Data(arg, strlen(argv[i]), hash);
+
+ if (fnmatch(hash_pattern, hash, 0) != 0) {
+ for (j = i; j < argc - 1; j++)
+ argv[j] = argv[j + 1];
+ argc--;
+ continue;
+ }
+ }
+
msg("Dumping file/directory %s\n", argv[i]);
dirc++;
}
if (mountpoint)
@@ -671,11 +697,11 @@
const char *prog = getprogname();
(void)fprintf(stderr,
"usage: %s [-0123456789aceFinStuX] [-B records] [-b blocksize]\n"
-" [-d density] [-f file] [-h level] [-k read-blocksize]\n"
-" [-L label] [-l timeout] [-r cachesize] [-s feet]\n"
-" [-T date] [-x snap-backup] files-to-dump\n"
+" [-d density] [-f file] [-h level] [-H hash_pattern]\n"
+" [-k read-blocksize] [-L label] [-l timeout] [-r cachesize]\n"
+" [-s feet] [-T date] [-U dumpdev] [-x snap-backup] files-to-dump\n"
" %s [-W | -w]\n", prog, prog);
exit(X_STARTUP);
}
--
Emmanuel Dreyfus
manu%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index