about summary refs log tree commit diff
path: root/scripts/ssh.pm
blob: 233c5a4aa7413f8454a1fc81c04fa774f7a28eb0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use strict;
use File::Temp qw(tempdir);

our @sshOpts = split ' ', ($ENV{"NIX_SSHOPTS"} or "");

my $sshStarted = 0;
my $sshHost;

# Open a master SSH connection to `host', unless there already is a
# running master connection (as determined by `-O check').
sub openSSHConnection {
    my ($host) = @_;
    die if $sshStarted;
    $sshHost = $host;
    return 1 if system("ssh $sshHost @sshOpts -O check 2> /dev/null") == 0;

    my $tmpDir = tempdir("nix-ssh.XXXXXX", CLEANUP => 1, TMPDIR => 1)
        or die "cannot create a temporary directory";
    
    push @sshOpts, "-S", "$tmpDir/control";
    system("ssh $sshHost @sshOpts -M -N -f") == 0
        or return 0;
    $sshStarted = 1;
    return 1;
}

# Tell the master SSH client to exit.
sub closeSSHConnection {
    if ($sshStarted) {
        system("ssh $sshHost @sshOpts -O exit 2> /dev/null") == 0
            or warn "unable to stop SSH master: $?";
    }
}

END { my $saved = $?; closeSSHConnection; $? = $saved; }

return 1;