Initial revision
[ssh-agent-manager.git] / ssh-agent-manager
1 #!/usr/bin/perl
2 # -----------------------------------------------------------------------------
3 # Esta programa envuelve la ssh-agent. Devuelve los mismos pid y socket siemple
4 # durante la ssh-agent está viva.
5 # -----------------------------------------------------------------------------
6 # No puede hacer `ssh-agent-manager <mandado>'.
7 # -----------------------------------------------------------------------------
8 use strict;
9 use warnings;
10 use IO::File;
11
12 # Esta programa no dedice el tipo de shell usa usted.
13 # Lo fije siemple.
14 my $csh_mode;
15 my $bsh_mode;
16 foreach my $arg (@ARGV) {
17     if ($arg eq '-c') {
18         $csh_mode = 1;
19     }
20     elsif ($arg eq '-s') {
21         $bsh_mode = 1;
22     }
23 }
24 if ((!$csh_mode and !$bsh_mode) or
25       ($csh_mode and $bsh_mode)) {
26     print "Usage: ssh-agent-manager (-c | -s)\n";
27     print "\n";
28     print "  -c  csh mode\n";
29     print "  -s  bsh mode\n";
30     exit;
31 }
32
33 # lee /tmp/ssh-agent-info si ése existe.
34 # $> es la uid efectiva.
35 my $infofile = IO::File->new("/tmp/ssh-agent-info.$>", 'r');
36 if ($infofile) {
37     my @contents = <$infofile>;
38     my $info = &parse(join("\n", @contents));
39     $infofile->close;
40
41     my $pid = $info->{'SSH_AGENT_PID'};
42     if ($pid and kill(0, $pid) == 1) {
43         # ssh-agent está aún viva.
44         &serialize($info);
45         exit;
46     }
47 }
48
49 # comienza la ssh-agent...
50 my $info = &parse(scalar `ssh-agent -s`);
51
52 $infofile = IO::File->new("/tmp/ssh-agent-info.$>", 'w');
53 while (my ($key, $value) = each %$info) {
54     $infofile->print("$key=$value\n");
55 }
56 $infofile->close;
57
58 &serialize($info);
59 exit;
60
61 sub parse {
62     my $lines = shift;
63     my %info;
64     foreach my $line (split /\n/, $lines) {
65         chomp $line;
66         # falte si el formato que la da `ssh-agent -s` cambie...
67         if ($line =~ m/^(.+?)=(.+?);/ or
68               $line =~ m/^(.+?)=(.+)$/) {
69             $info{$1} = $2;
70         }
71     }
72     \%info;
73 }
74
75 sub serialize {
76     my $info = shift;
77     while (my ($key, $value) = each %$info) {
78         if ($bsh_mode) {
79             print qq{$key=$value; export $key;\n};
80         }
81         elsif ($csh_mode) {
82             print qq{setenv $key $value;\n};
83         }
84     }
85 }