X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=bak-git-server.pl;h=2872e33d6ff13b4cc63278c926f6e8bf8ba7b6af;hb=b93f3fcb8331b8de4348ef5618af1e506d742dae;hp=f1806a4e8dee28f9390cca0a00e31d6abcf85ad6;hpb=95cbf2a0cc8ccaff8a0f0efa720d96277d435368;p=bak-git.git diff --git a/bak-git-server.pl b/bak-git-server.pl index f1806a4..2872e33 100755 --- a/bak-git-server.pl +++ b/bak-git-server.pl @@ -33,6 +33,7 @@ bak command overview: bak revert [host:]/path bak cat [host:]/path + bak grep pattern bak - push all changed files to server @@ -91,6 +92,16 @@ warn "# ssh_client $hostname $server"; return $path; } +sub _kill_ssh { + while ( my($host,$pid) = each %$ssh_tunnel ) { + warn "$host kill TERM $pid"; + kill 15, $pid; # TERM + } +} + +#$SIG{INT}; +$SIG{TERM} = &_kill_ssh; + chdir $dir; system 'git init' unless -e '.git'; @@ -104,28 +115,39 @@ if ( $upgrade || $install ) { system 'ssh-copy-id', "root\@$hostname" if ! -d $hostname; my $path = shell_client( $hostname ); system "scp $path root\@$hostname:/usr/local/bin/"; - system "ssh root\@$hostname apt-get install -y rsync"; + system "ssh root\@$hostname apt-get install -y netcat rsync"; } } else { my $ssh = $ENV{SSH} || 'ssh'; warn "# start $ssh tunnels..."; foreach my $host ( keys %$ssh_tunnel ) { warn "## $host\n"; - open( $ssh_tunnel->{$host}, '-|', "$ssh -N root\@$host &" ) or die $!; + my $pid = fork; + if ( ! defined $pid ) { + die "fork: $!"; + } elsif ( $pid ) { +# waitpid $pid, 0; + warn "FIXME: waitpid $pid"; + } else { + warn "EXEC $ssh $host"; + exec "$ssh -N root\@$host"; + } + + $ssh_tunnel->{$host} = $pid; } } +warn "dir: $dir listen: $server_ip:9001\n"; + my $server = IO::Socket::INET->new( Proto => 'tcp', - LocalAddr => $server_ip, +# LocalAddr => $server_ip, LocalPort => 9001, Listen => SOMAXCONN, Reuse => 1 ) || die $!; -warn "dir: $dir listen: $server_ip:9001\n"; - sub rsync { warn "# rsync ",join(' ', @_), "\n"; system 'rsync', @_; @@ -234,7 +256,9 @@ while (my $client = $server->accept()) { } elsif ( $command eq 'ls' ) { print $client `ls $backup_path`; } elsif ( $command eq 'show' ) { - print $client `git show`; + print $client `git show $rel_path`; + } elsif ( $command eq 'grep' ) { + print $client `git log -g --grep=$rel_path`; } else { print $client "Unknown command: $command\n"; }