better handling of ssh tunnels and listen on all IPs
[bak-git.git] / bak-git-server.pl
index f1806a4..dd717a5 100755 (executable)
@@ -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';
 
@@ -111,21 +122,32 @@ if ( $upgrade || $install ) {
        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";
        }