1 |
#!/usr/bin/perl |
2 |
|
3 |
=head1 NAME |
4 |
|
5 |
rsync-here.pl |
6 |
|
7 |
|
8 |
=head1 SYNOPSIS |
9 |
|
10 |
Wrapper around rsync program to provide an easy calling syntax for rsyncing against a predefined target. |
11 |
|
12 |
|
13 |
=head1 DESCRIPTION |
14 |
|
15 |
Before starting, your need to configure some specific variables in this file. Please see section CONFIGURATION. |
16 |
rsync-here.pl expects a single argument on the command line. Give it a full directory path and |
17 |
it will run the rsync program in the following style: (abstract) |
18 |
|
19 |
cd /$root; \ # go to one level on top of the specified source path |
20 |
$rsync -azuv -R -e ssh --progress $source $target |
21 |
|
22 |
|
23 |
=head1 CONFIGURATION |
24 |
|
25 |
Please edit "rsync-here.pl" to configure it, there is no ".ini"-style configuration file yet. |
26 |
|
27 |
=over 4 |
28 |
|
29 |
=item - |
30 |
$sh: /path/to/your/sh |
31 |
|
32 |
=item - |
33 |
$rsync: /path/to/your/rsync |
34 |
|
35 |
=item - |
36 |
$target_prefix: username@host.mydomain.org |
37 |
|
38 |
=item - |
39 |
$target_base: /path/to/your/backup-repository-base |
40 |
|
41 |
=back |
42 |
|
43 |
The hostname of your machine will be appended to "$target_base", on windows also the volumename. |
44 |
|
45 |
|
46 |
=head1 PREREQUISITES |
47 |
|
48 |
=over 4 |
49 |
|
50 |
=item * |
51 |
Perl |
52 |
|
53 |
=item * |
54 |
Rsync |
55 |
|
56 |
=item * |
57 |
SSH |
58 |
|
59 |
=back |
60 |
|
61 |
You also may find it convenient to setup ssh working with keys. (use ssh-keygen [-d]) |
62 |
|
63 |
|
64 |
=head1 COPYRIGHT |
65 |
|
66 |
This program is free software. You may copy or |
67 |
redistribute it under the same terms as Perl itself. |
68 |
|
69 |
|
70 |
=head1 TODO |
71 |
|
72 |
=over 4 |
73 |
|
74 |
=item |
75 |
+ windows compatibility |
76 |
|
77 |
=item |
78 |
+ waiting for keypress on exit: better handling |
79 |
|
80 |
=item |
81 |
+ write output to STDOUT while working! |
82 |
|
83 |
=item |
84 |
- ease ssh-key-setup for non-interactive use, include doc at min! |
85 |
|
86 |
=item |
87 |
- read "user - config" variables from %ENV |
88 |
|
89 |
=item |
90 |
- make it possible to sync single files |
91 |
|
92 |
=back |
93 |
|
94 |
=cut |
95 |
|
96 |
use strict; |
97 |
use warnings; |
98 |
use Sys::Hostname; |
99 |
|
100 |
# user - config |
101 |
my $sh = "sh"; |
102 |
my $rsync = "rsync"; |
103 |
my $target_prefix = 'joko@martha'; |
104 |
my $target_base = '~/backup'; |
105 |
my $bool_dry_run = 0; |
106 |
|
107 |
|
108 |
# used variables |
109 |
my $rootpath; |
110 |
my $rootpath_append; |
111 |
my $hostname; |
112 |
my $source; |
113 |
my $source_volume; |
114 |
my $target; |
115 |
|
116 |
# runtime - config |
117 |
BEGIN { sub RUNNING_IN_HELL () { $^O eq 'MSWin32' } } |
118 |
|
119 |
$rootpath = "/"; |
120 |
if (RUNNING_IN_HELL) { |
121 |
$rootpath = "/cygdrive"; |
122 |
} |
123 |
|
124 |
|
125 |
# main - get and validate arguments |
126 |
$source = shift; |
127 |
if (!$source) { |
128 |
print "no source path given, exit.", "\n"; |
129 |
exit; |
130 |
} |
131 |
|
132 |
# main - modify source |
133 |
if (RUNNING_IN_HELL) { |
134 |
$source =~ s/^(\w)://i; |
135 |
$source_volume = $1; |
136 |
if (!$source_volume) { |
137 |
print "we are running on windows, please give full path including volume. (e.g. \"c:\\home\")"; |
138 |
exit; |
139 |
} |
140 |
# convert backslashes to slashes |
141 |
$source =~ s/\\/\//g; |
142 |
$source_volume = lc $source_volume; |
143 |
#$sourcePath = "/cygdrive/$sourcePath_volume$sourcePath"; |
144 |
$rootpath_append = "/$source_volume/"; |
145 |
} |
146 |
# strip leading and trailing slash, if any |
147 |
$source =~ s/^\///; |
148 |
$source =~ s/\/$//; |
149 |
|
150 |
|
151 |
# main - modify target |
152 |
$hostname = hostname; |
153 |
$hostname ||= "DUMMY"; |
154 |
$target = "$target_prefix:$target_base/$hostname/"; |
155 |
if (RUNNING_IN_HELL) { |
156 |
$target .= "$source_volume/"; |
157 |
} |
158 |
|
159 |
|
160 |
# main - build rsync command |
161 |
my $cmd; |
162 |
|
163 |
my $opt_dry_run = ""; |
164 |
$opt_dry_run = "--dry-run" if ($bool_dry_run); |
165 |
|
166 |
if ($rootpath_append) { $rootpath .= $rootpath_append; } |
167 |
|
168 |
$cmd = "$sh -c 'cd $rootpath; $rsync -azuv -e ssh -R --progress --times $opt_dry_run \"$source\" \"$target\"'"; |
169 |
print "synchronizing directories with...", "\n"; |
170 |
print "cmd: ", $cmd, "\n"; |
171 |
|
172 |
# main - run rsync |
173 |
open(STDERR,'>&STDOUT'); # redirect error to out |
174 |
$| = 1; # no buffering |
175 |
system($cmd); # execute system command |
176 |
|
177 |
# wait for pressing <ENTER> |
178 |
print "\n"; |
179 |
print "sleeping, press <ENTER> to continue..."; |
180 |
read STDIN, (my $content), 1; |
181 |
|