File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / rsyncdb-mountinfo
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 3 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    1: #!/usr/bin/perl
    2: 
    3: # This script outputs data for rsyncdb --mounts.  It must output a complete
    4: # list of the mounts for the current host in a strict format -- 2 fields
    5: # with a Tab between:  $MOUNT_UNIQ\t$PATH
    6: #
    7: # The list of mounts MUST NOT contain any entry that has the same devnum
    8: # (st_dev) as any other entry in the list (as checked via its PATH).
    9: #
   10: # MOUNT_UNIQ is a unique string that identifies the mount on this host.
   11: # This cannot be the devnum (st_dev) because that can vary depending on the
   12: # mount order or be reused for different mounts if they are not mounted at
   13: # the same time.  Ideally this would be its UUID value, if that is available
   14: # on this OS.  This script looks in /dev/disk/by-uuid for the current UUID
   15: # mappings).  If the UUID is not found, the fallback default is the string
   16: # "Mount of $devname", which should be adequate for situations that don't
   17: # use removable media (though you may need to take steps to weed-out removable
   18: # mounts).
   19: #
   20: # You can override the MOUNT_UNIQ value by putting a .rsyncdb_mount_uniq
   21: # file in the root directory of any mount, at which point it is up to you
   22: # to make sure that the value stays unique (note that all sequences of
   23: # whitespace are transformed into a single space, and leading/trailing
   24: # whitespace is removed).
   25: #
   26: # MOUNT_UNIQ may never contain a Tab but it would be legal for PATH to have
   27: # a Tab (just really weird).  Neither may have a CR or LF in it.
   28: #
   29: # The maximum size for MOUNT_UNIQ is 256 characters.
   30: #
   31: # If this script doesn't meet your needs, feel free to edit/replace it and
   32: # choose some other method of finding a unique value for each mount.  If you
   33: # come up with a good idiom that might be useful to others, please share it
   34: # with the rsync mailing list.
   35: 
   36: use strict;
   37: use warnings;
   38: use Cwd 'abs_path';
   39: 
   40: my @MOUNT_FILES = qw( /proc/mounts /etc/mtab );
   41: my $VALID_DEVICE_REGEX = qr{^/dev|^rootfs$};
   42: my $UUID_DIR = '/dev/disk/by-uuid';
   43: my $OVERRIDE_FILE = '.rsyncdb_mount_uniq';
   44: 
   45: my (%hash, %uuid);
   46: 
   47: if (-d $UUID_DIR) {
   48:     foreach my $uuid (glob "$UUID_DIR/*") {
   49: 	my $lnk = readlink($uuid);
   50: 	if ($lnk !~ m{^/}) {
   51: 	    $lnk = abs_path("$UUID_DIR/$lnk");
   52: 	}
   53: 	$uuid =~ s{.*/}{};
   54: 	$uuid{$lnk} = $uuid;
   55:     }
   56: }
   57: 
   58: foreach my $mount_file (@MOUNT_FILES) {
   59:     if (open MOUNTS, $mount_file) {
   60: 	while (<MOUNTS>) {
   61: 	    my ($devname, $path) = (split)[0,1];
   62: 	    next unless $devname =~ /$VALID_DEVICE_REGEX/;
   63: 
   64: 	    my ($devno) = (stat($path))[0];
   65: 	    next unless defined $devno; # Skip if mount is invalid.
   66: 	    next if $hash{$devno}++; # SKip if we've seen this devno earlier.
   67: 
   68: 	    my $mount_uniq = $uuid{$devname} ? $uuid{$devname} : "Mount of $devname";
   69: 	    if (open UNIQ, '<', "$path/$OVERRIDE_FILE") {
   70: 		$mount_uniq = <UNIQ>;
   71: 		close UNIQ;
   72: 		$mount_uniq =~ s/\s+/ /g; # This ensures no tab, CR, nor LF.
   73: 		$mount_uniq =~ s/^ | $//g; # .. and no leading or trailing whitespace.
   74: 	    }
   75: 	    print $mount_uniq, "\t", $path, "\n";
   76: 	}
   77: 	close MOUNTS;
   78: 	exit;
   79:     }
   80: }
   81: 
   82: die "Failed to to open any mount files: @MOUNT_FILES\n";

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>