|
1 #! /usr/bin/perl -w |
|
2 # $Id$ |
|
3 # $URL$ |
|
4 |
|
5 my $USAGE = <<'_'; |
|
6 Usage: $ME [options] host |
|
7 host destination host |
|
8 -v --[no]verbose be verbose [$opt_verbose] |
|
9 -k --keepgoing don't stop on errors [$opt_keepgoing] |
|
10 _ |
|
11 |
|
12 use strict; |
|
13 use File::Basename; |
|
14 use Getopt::Long; |
|
15 use Net::SSH qw(sshopen2); |
|
16 use Sys::Hostname::Long; |
|
17 use Socket; |
|
18 |
|
19 my $ME = basename $0; |
|
20 my $CONFIG = "./config"; |
|
21 |
|
22 my $opt_verbose = 0; |
|
23 my $opt_keepgoing = 0; |
|
24 |
|
25 MAIN: { |
|
26 GetOptions( |
|
27 "verbose!" => \$opt_verbose, |
|
28 "keepgoing" => \$opt_keepgoing, |
|
29 ) or die eval "\"$USAGE\""; |
|
30 |
|
31 unless (scalar(@ARGV) == 1) { die eval "\"$USAGE\""; } |
|
32 |
|
33 (my $host = $ARGV[0]) =~ s/.*\/([a-z0-9.-]+).*/$1/; |
|
34 my $ip = scalar gethostbyname($host); |
|
35 |
|
36 $ip or do { |
|
37 warn "can't resolve $host\n"; |
|
38 next; |
|
39 }; |
|
40 my $addr = inet_ntoa($ip); |
|
41 my $hostname_long = hostname_long(); |
|
42 |
|
43 my $user = "root"; |
|
44 my $path = "/root/Config/Hosts/$hostname_long"; |
|
45 my $ssh_cmd = "mkdir -m 0700 -p $path"; |
|
46 |
|
47 sshopen2("$user\@$host", *READER, *WRITER, "$ssh_cmd") || die "ssh: $!"; |
|
48 close(READER); close(WRITER); |
|
49 |
|
50 open(CONF, $CONFIG) or die "$ME: Can't open $CONFIG: $!\n"; |
|
51 |
|
52 my @cmd = ( |
|
53 qw(rsync --rsh), |
|
54 "ssh -x", |
|
55 qw(--compress --numeric-ids |
|
56 --delete --delete-excluded |
|
57 --archive --relative) |
|
58 ); |
|
59 push @cmd, "--verbose" if $opt_verbose; |
|
60 |
|
61 # get exclusion list |
|
62 while (<CONF>) { |
|
63 chomp; |
|
64 /^!(.*)\s*/ or next; |
|
65 push @cmd, "--exclude", $1; |
|
66 } |
|
67 seek CONF, 0, 0 or die "$ME: Can't seek $CONFIG: $!\n"; |
|
68 |
|
69 while (<CONF>) { |
|
70 chomp; |
|
71 /^\// or next; |
|
72 my $status = ""; |
|
73 my $src = "$_"; |
|
74 my $dst = "$user\@$host:$path"; |
|
75 print "* $src -> $dst$_\n"; |
|
76 system @cmd, $src, $dst; |
|
77 if ($?) { |
|
78 $status = "ERR " . ($? >> 8); |
|
79 $status .= " SIGNAL " . ($? & 127); |
|
80 } else { $status = "OK"; }; |
|
81 |
|
82 if ($status ne "OK") { |
|
83 warn "$ME: ???. system command ended with $status" unless $opt_keepgoing; |
|
84 } |
|
85 } |
|
86 |
|
87 my $STAMP = "/var/tmp/get-config.stamp"; |
|
88 open(TOUCH, ">$STAMP") or die "$ME: Can't open >>$STAMP: $!\n"; |
|
89 close(TOUCH); |
|
90 |
|
91 } |
|
92 |
|
93 # vim:sts=4 sw=4 aw ai sm: |