send-config.pl
changeset 1 2ee0eb0ef5d3
child 3 6cc86a8d1085
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/send-config.pl	Thu Apr 28 14:28:04 2005 +0000
@@ -0,0 +1,93 @@
+#! /usr/bin/perl -w
+# $Id$
+# $URL$
+
+my $USAGE = <<'_';
+Usage: $ME [options] host
+       host		destination host
+       -v --[no]verbose	be verbose [$opt_verbose]
+       -k --keepgoing	don't stop on errors [$opt_keepgoing]
+_
+
+use strict;
+use File::Basename;
+use Getopt::Long;
+use Net::SSH qw(sshopen2);
+use Sys::Hostname::Long;
+use Socket;
+
+my $ME = basename $0;
+my $CONFIG = "./config";
+
+my $opt_verbose = 0;
+my $opt_keepgoing = 0;
+
+MAIN: {
+    GetOptions(
+	"verbose!"  => \$opt_verbose,
+	"keepgoing" => \$opt_keepgoing,
+    ) or die eval "\"$USAGE\"";
+
+    unless (scalar(@ARGV) == 1) { die eval "\"$USAGE\""; }
+    
+    (my $host = $ARGV[0]) =~ s/.*\/([a-z0-9.-]+).*/$1/;
+    my $ip = scalar gethostbyname($host);
+    
+    $ip or do {
+	warn "can't resolve $host\n";
+	next;
+    };
+    my $addr = inet_ntoa($ip);
+    my $hostname_long = hostname_long();
+
+    my $user = "root";
+    my $path = "/root/Config/Hosts/$hostname_long";
+    my $ssh_cmd = "mkdir -m 0700 -p $path";
+    
+    sshopen2("$user\@$host", *READER, *WRITER, "$ssh_cmd") || die "ssh: $!";
+    close(READER); close(WRITER);
+
+    open(CONF, $CONFIG) or die "$ME: Can't open $CONFIG: $!\n";
+
+    my @cmd = (
+	qw(rsync --rsh),
+	"ssh -x",
+	qw(--compress --numeric-ids
+	   --delete --delete-excluded
+	   --archive --relative)
+    );
+    push @cmd, "--verbose" if $opt_verbose;
+    
+    # get exclusion list
+    while (<CONF>) {
+	chomp;
+	 /^!(.*)\s*/ or next;
+	 push @cmd, "--exclude", $1;
+    }
+    seek CONF, 0, 0 or die "$ME: Can't seek $CONFIG: $!\n";
+
+    while (<CONF>) {
+	chomp;
+	/^\// or next;
+	my $status = "";
+	my $src = "$_";
+	my $dst = "$user\@$host:$path";
+	print "* $src -> $dst$_\n";
+	system @cmd, $src, $dst;
+	if ($?) {
+	    $status = "ERR " . ($? >> 8);
+	    $status .= " SIGNAL " . ($? & 127);
+	} else { $status = "OK"; };
+
+	if ($status ne "OK") {
+	    warn "$ME: ???. system command ended with $status" unless $opt_keepgoing;
+	}
+    }
+
+    my $STAMP = "/var/tmp/get-config.stamp";
+    open(TOUCH, ">$STAMP") or die "$ME: Can't open >>$STAMP: $!\n";
+    close(TOUCH);
+
+}
+
+# vim:sts=4 sw=4 aw ai sm: