diff -urN e-smith-samba-2.2.0.old/root/etc/e-smith/events/actions/shadow-copy-rotate e-smith-samba-2.2.0/root/etc/e-smith/events/actions/shadow-copy-rotate --- e-smith-samba-2.2.0.old/root/etc/e-smith/events/actions/shadow-copy-rotate 2013-10-10 23:02:51.344638596 -0600 +++ e-smith-samba-2.2.0/root/etc/e-smith/events/actions/shadow-copy-rotate 2013-10-10 23:10:40.160682162 -0600 @@ -4,6 +4,7 @@ use warnings; use POSIX qw(strftime); use File::Path; +use File::Basename; use esmith::ConfigDB; use esmith::AccountsDB; @@ -11,6 +12,7 @@ sub stagger; sub powershift; sub shadowdir; +sub rmshadow; my $cdb = esmith::ConfigDB->open_ro; my $adb = esmith::AccountsDB->open_ro(); @@ -27,6 +29,43 @@ my $filesdir = '/home/e-smith/files'; my $snapfmt = '@GMT-%Y.%m.%d-%H.%M.%S'; +# Switch old shadow directories to new format +opendir(SHADOW, $shadowdir); +foreach my $s ( grep { /^\d/ && ! -l "$shadowdir/$_" && -d "$shadowdir/$_" } readdir SHADOW ) { + my @stat = stat("$shadowdir/$s"); + rename "$shadowdir/$s", "$shadowdir/".strftime($snapfmt, gmtime($stat[9])); + symlink strftime($snapfmt, gmtime($stat[9])), "$shadowdir/$s"; +} +closedir(SHADOW); + +# remove old symlinks in ibays +foreach my $ibay ($adb->ibays()) { + my $ibaydir = 'ibays/' . $ibay->key . ( $ibay->prop('PublicAccess') eq 'none' ? '/files' : '' ); + + opendir(IBAY, "$filesdir/$ibaydir") || next; + unlink "$filesdir/$ibaydir/$_" foreach (grep /^\@GMT-/, readdir(IBAY)); + closedir(IBAY); +} + +# remove old symlinks in ibays +foreach my $user ($adb->users()) { + my $userdir = 'users/' . $user->key . '/home'; + + opendir(USER, "$filesdir/$userdir") || next; + unlink "$filesdir/$userdir/$_" foreach (grep /^\@GMT-/, readdir(USER)); + closedir(USER); +} + +# Create sync point if it doesn't already exist +my $snapdir = strftime($snapfmt, gmtime(time)); +if ( -d "$shadowdir/0" ) { + rename "$shadowdir/".readlink("$shadowdir/0"), "$shadowdir/$snapdir"; + unlink "$shadowdir/0"; +} else { + mkdir "$shadowdir/$snapdir"; +} +symlink "$snapdir", "$shadowdir/0"; + # Create list of ibays and users to shadow my ($ibays, $users, $link) = ('','',''); my @ibays = grep { ($_->prop('ShadowCopy') || 'enabled') ne 'disabled' } $adb->ibays(); @@ -39,76 +78,53 @@ # Sync directories to shadow directory if ( $ibays || $users) { - system("rsync -aHmR --partial --exclude '\@GMT-*' $link $ibays $users $shadowdir/0/") == 0 - or die "Couldn't sync directories"; + system("rsync -aHmR --partial --delete --delete-excluded --exclude 'aquota.*' $link $ibays $users $shadowdir/0/") == 0 + or die "Couldn't sync directories"; } # Shift directories using geometric roll-off (only if different) if ( -d "$shadowdir/1" ) { - if (system("diff -qr $shadowdir/0 $shadowdir/1 > /dev/null") == 0) { - rmtree "$shadowdir/0"; - } else { - powershift(2) if -d shadowdir(-$offset); - for (my $i=2; $i >= -$offset; $i--) { - rename shadowdir($i), shadowdir($i+1) - } - } + if (system("diff -qr $shadowdir/0 $shadowdir/1 &> /dev/null") == 0) { + rmshadow("$shadowdir/0"); + } else { + powershift(2) if -d shadowdir(-$offset); + for (my $i=2; $i >= -$offset; $i--) { + rename shadowdir($i), shadowdir($i+1) + } + } } else { - rename "$shadowdir/0", "$shadowdir/1"; -} - -opendir(SHADOW, $shadowdir); -my %snaps = map { my @stat = stat("$shadowdir/$_"); $_ => strftime($snapfmt, gmtime($stat[9])) } - grep { -d "$shadowdir/$_" && ! /^\./ } readdir SHADOW; -closedir(SHADOW); - -foreach my $ibay ($adb->ibays()) { - my $ibaydir = 'ibays/' . $ibay->key . ( $ibay->prop('PublicAccess') eq 'none' ? '/files' : '' ); - - opendir(IBAY, "$filesdir/$ibaydir") || next; - unlink "$filesdir/$ibaydir/$_" foreach (grep /^\@GMT-/, readdir(IBAY)); - closedir(IBAY); - - next if ($ibay->prop('ShadowCopy') || 'enabled') eq 'disabled'; - - foreach my $snap (keys %snaps) { - symlink "$shadowdir/$snap/$ibaydir", "$filesdir/$ibaydir/$snaps{$snap}" if -d "$shadowdir/$snap/$ibaydir"; - } + rename "$shadowdir/0", "$shadowdir/1"; } -foreach my $user ($adb->users()) { - my $userdir = 'users/' . $user->key . '/home'; - - opendir(USER, "$filesdir/$userdir") || next; - unlink "$filesdir/$userdir/$_" foreach (grep /^\@GMT-/, readdir(USER)); - closedir(USER); - - next if ($user->prop('ShadowCopy') || 'enabled') eq 'disabled'; - - foreach my $snap (keys %snaps) { - symlink "$shadowdir/$snap/$userdir", "$filesdir/$userdir/$snaps{$snap}" if -d "$shadowdir/$snap/$userdir"; - } +sub rmshadow { + my $d = shift; + if ( -l "$d" ) { + rmtree dirname($d)."/".readlink($d); + unlink "$d"; + } elsif ( -d "$d" ) { + rmtree "$d" + } } sub shadowdir { - my $i = shift; - return "$shadowdir/".($i+$offset); + my $i = shift; + return "$shadowdir/".($i+$offset); } sub stagger { - my $i = shift; - return $i + ($i >> 1); + my $i = shift; + return $i + ($i >> 1); } sub powershift { - my $i = shift; - if ( -d shadowdir(stagger($i)) ) { - my $n = powershift($i << 1); - $i = $n >> 1; - rename shadowdir(stagger($i)), shadowdir($n) if -d shadowdir(stagger($i)); - rmtree shadowdir($i) if -d shadowdir($i); - } else { - rename shadowdir($i), shadowdir(stagger($i)) if -d shadowdir($i); - } - return $i; + my $i = shift; + if ( -d shadowdir(stagger($i)) ) { + my $n = powershift($i << 1); + $i = $n >> 1; + rename shadowdir(stagger($i)), shadowdir($n) if -d shadowdir(stagger($i)); + rmshadow(shadowdir($i)); + } else { + rename shadowdir($i), shadowdir(stagger($i)) if -d shadowdir($i); + } + return $i; } diff -urN e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/10shadowcopy e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/10shadowcopy --- e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/10shadowcopy 2013-10-10 23:02:51.355639734 -0600 +++ e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/10shadowcopy 2013-10-10 23:08:38.211712503 -0600 @@ -1,4 +1,8 @@ { - $vfs->{shadow_copy} = () if (($smb{'ShadowCopy'} || 'disabled') eq 'enabled'); $OUT = ""; + return unless (($smb{'ShadowCopy'} || 'disabled') eq 'enabled'); + + $vfs->{shadow_copy2}->{snapdir} = $smb{ShadowDir} || '/home/e-smith/files/.shadow'; + $vfs->{shadow_copy2}->{basedir} = "/home/e-smith/files"; + $vfs->{shadow_copy2}->{fixinodes} = 'yes'; } diff -urN e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/50homesVFS e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/50homesVFS --- e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/50homesVFS 2013-10-10 23:02:51.349639148 -0600 +++ e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/50homesVFS 2013-10-10 23:08:38.211712503 -0600 @@ -3,8 +3,9 @@ $OUT = "vfs objects = " . (join " ", keys %$vfs) . "\n"; foreach $mod (keys %$vfs) { + ($mod2) = $mod =~ m{^([^_]+)}; foreach $opt (keys %{$vfs->{$mod}}) { - $OUT .= " $mod:$opt=$vfs->{$mod}->{$opt}\n"; + $OUT .= " $mod2:$opt=$vfs->{$mod}->{$opt}\n"; } } } diff -urN e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/ibays/10shadowcopy e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/ibays/10shadowcopy --- e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/ibays/10shadowcopy 2013-10-10 23:02:51.352639452 -0600 +++ e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/ibays/10shadowcopy 2013-10-10 23:09:05.903562870 -0600 @@ -3,5 +3,7 @@ return if (($smb{'ShadowCopy'} || 'disabled') eq 'disabled'); return if (($ibay->prop('ShadowCopy') || 'enabled') eq 'disabled'); - $ibay_vfs->{shadow_copy} = (); + $ibay_vfs->{shadow_copy2}->{snapdir} = $smb{ShadowDir} || '/home/e-smith/files/.shadow'; + $ibay_vfs->{shadow_copy2}->{basedir} = "/home/e-smith/files"; + $ibay_vfs->{shadow_copy2}->{fixinodes} = 'yes'; } diff -urN e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/ibays/90vfs e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/ibays/90vfs --- e-smith-samba-2.2.0.old/root/etc/e-smith/templates/etc/smb.conf/ibays/90vfs 2013-10-10 23:02:51.351639352 -0600 +++ e-smith-samba-2.2.0/root/etc/e-smith/templates/etc/smb.conf/ibays/90vfs 2013-10-10 23:09:05.903562870 -0600 @@ -3,8 +3,9 @@ $OUT = "vfs objects = " . (join " ", keys %$ibay_vfs) . "\n"; foreach $mod (keys %$ibay_vfs) { + ($mod2) = $mod =~ m{^([^_]+)}; foreach $opt (keys %{$ibay_vfs->{$mod}}) { - $OUT .= " $mod:$opt=$ibay_vfs->{$mod}->{$opt}\n"; + $OUT .= " $mod2:$opt=$ibay_vfs->{$mod}->{$opt}\n"; } } }