send-config.pl
changeset 1 2ee0eb0ef5d3
child 3 6cc86a8d1085
equal deleted inserted replaced
0:2b7323a88cff 1:2ee0eb0ef5d3
       
     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: