#! /usr/bin/perl -w
# $Id: send-config.pl 840 2005-04-28 14:28:04Z arnold $
# $URL: svn://svn.schlittermann.de/is/send-config/trunk/send-config.pl $

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 = "/etc/send-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/Configs/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;
    
    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:
