Annotation of embedaddon/rsync/support/munge-symlinks, revision 1.1.1.2
1.1.1.2 ! misho 1: #!/usr/bin/env perl
1.1 misho 2: # This script will either prefix all symlink values with the string
3: # "/rsyncd-munged/" or remove that prefix.
4:
5: use strict;
6: use Getopt::Long;
7:
8: my $SYMLINK_PREFIX = '/rsyncd-munged/';
9:
10: my $munge_opt;
11:
12: &GetOptions(
13: 'munge' => sub { $munge_opt = 1 },
14: 'unmunge' => sub { $munge_opt = 0 },
15: 'all' => \( my $all_opt ),
16: 'help|h' => \( my $help_opt ),
17: ) or &usage;
18:
19: &usage if $help_opt || !defined $munge_opt;
20:
21: my $munged_re = $all_opt ? qr/^($SYMLINK_PREFIX)+(?=.)/ : qr/^$SYMLINK_PREFIX(?=.)/;
22:
23: push(@ARGV, '.') unless @ARGV;
24:
25: open(PIPE, '-|', 'find', @ARGV, '-type', 'l') or die $!;
26:
27: while (<PIPE>) {
28: chomp;
29: my $lnk = readlink($_) or next;
30: if ($munge_opt) {
31: next if !$all_opt && $lnk =~ /$munged_re/;
32: $lnk =~ s/^/$SYMLINK_PREFIX/;
33: } else {
34: next unless $lnk =~ s/$munged_re//;
35: }
36: if (!unlink($_)) {
37: warn "Unable to unlink symlink: $_ ($!)\n";
38: } elsif (!symlink($lnk, $_)) {
39: warn "Unable to recreate symlink: $_ -> $lnk ($!)\n";
40: } else {
41: print "$_ -> $lnk\n";
42: }
43: }
44:
45: close PIPE;
46: exit;
47:
48: sub usage
49: {
50: die <<EOT;
51: Usage: munge-symlinks --munge|--unmunge [--all] [DIR|SYMLINK...]
52:
53: --munge Add the $SYMLINK_PREFIX prefix to symlinks if not already
54: present, or always when combined with --all.
55: --unmunge Remove one $SYMLINK_PREFIX prefix from symlinks or all
56: such prefixes with --all.
57:
58: See the "munge symlinks" option in the rsyncd.conf manpage for more details.
59: EOT
60: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>