use strict;
-use File::Path qw(rmtree);
+use File::Path qw(remove_tree make_path);
use POSIX ();
sub _create_snapshot
{
- my ($base_path) = @_;
+ my ($base_path, $snapdir) = @_;
+
+ if (not defined($snapdir) or not $snapdir) {
+ $snapdir = ".snapdir";
+ }
+
+ my $snap_path_base = "";
+
+ if ($snapdir !~ /^\//) {
+ $snap_path_base = $base_path . "/";
+ }
+
+ $snap_path_base .= $snapdir;
+
my $time_str = POSIX::strftime("%Y.%m.%d-%H.%M.%S" , localtime());
- my $snap_path = $base_path . "/.snapshots/\@GMT-" . $time_str;
+ my $snap_path = $snap_path_base . "/\@GMT-" . $time_str;
+
my $ret;
- POSIX::mkdir($base_path . "/.snapshots", 0777);
+ make_path($snap_path, { mode => 0777 });
# add trailing slash to src path to ensure that only contents is copied
$ret = system("rsync", "-a", "--exclude=.snapshots/", "${base_path}/",
sub _delete_snapshot
{
- my ($base_path, $snap_path) = @_;
+ my ($base_path, $snap_path, $snapdir) = @_;
+
+ if (not defined($snapdir) or not $snapdir) {
+ $snapdir = ".snapdir";
+ }
+
+ my $snap_path_base = "";
+
+ if ($snapdir !~ /^\//) {
+ $snap_path_base = $base_path . "/";
+ }
+
+ $snap_path_base .= $snapdir;
# we're doing a recursive delete, so do some sanity checks
- if ((index($snap_path, $base_path) != 0) || (index($snap_path, ".snapshots") == -1)) {
+ if (index($snap_path, $snap_path_base . "/\@GMT-") != 0) {
print STDERR "invalid snap_path: $snap_path\n";
return -1;
}
my $num_args = $#ARGV + 1;
my $cmd = shift;
-if (($num_args == 2) && ($cmd eq "--check")) {
+if (($num_args == 2 or $num_args == 3) && ($cmd eq "--check")) {
$ret = 0;
-} elsif (($num_args == 2) && ($cmd eq "--create")) {
- $ret = _create_snapshot($ARGV[0]);
-} elsif (($num_args == 3) && ($cmd eq "--delete")) {
- $ret = _delete_snapshot($ARGV[0], $ARGV[1]);
+} elsif (($num_args == 2 or $num_args == 3) && ($cmd eq "--create")) {
+ $ret = _create_snapshot(@ARGV);
+} elsif (($num_args == 3 or $num_args == 4) && ($cmd eq "--delete")) {
+ $ret = _delete_snapshot(@ARGV);
} else {
print STDERR "invalid script argument\n";
$ret = -1;