Relaunch kinit if necessary.
authorIain Patterson <me@iain.cx>
Fri, 26 Nov 2010 15:38:49 +0000 (15:38 +0000)
committerIain Patterson <me@iain.cx>
Thu, 9 Dec 2010 15:25:48 +0000 (15:25 +0000)
Instead of processing the USR1 signal once to trigger the launch
of kinit, check for a running kinit whose parent is ktmux_helper
when we get USR1.  Do nothing if there is such a kinit but launch
one otherwise.

opt/bin/ktmux_helper

index 1ed6e46..31605c8 100755 (executable)
@@ -10,7 +10,7 @@ use POSIX ":sys_wait_h";
 my $PROG = $FindBin::Script;
 
 # Ensure tmux is our parent and find its PID.
-my $tmux_pid = &get_tmux_pid;
+our $tmux_pid = &get_tmux_pid;
 unless ($tmux_pid) {
   print STDERR "$PROG: Not a child of tmux!\n";
   exit 100;
@@ -23,13 +23,11 @@ $tmux_helper = $$;
 
 my $exitasap = 0;
 my $pid = 0;
-our $have_valid_credentials = undef;
 
 $SIG{INT} = \&cleanup;
 $SIG{QUIT} = \&cleanup;
 $SIG{TERM} = \&cleanup;
 $SIG{USR1} = \&want_credentials;
-$SIG{USR2} = \&got_credentials;
 
 LOOP: while (&ping_tmux) {
   $pid = fork;
@@ -48,7 +46,7 @@ LOOP: while (&ping_tmux) {
     exit 0;
   }
   else {
-    kill USR2, $tmux_helper unless &check_credentials;
+    exit 1 if &check_credentials;
     exec "krenew", "-K", "60";
     print "$PROG: Can't run krenew: $!\n";
     exit 111;
@@ -62,6 +60,13 @@ sub get_tmux_pid {
   return undef;
 }
 
+sub check_kinit_child {
+  foreach my $pid (`/bin/ps -o ppid= -C kinit`) {
+    return 1 if $pid =~ /^\s*$tmux_pid\s*$/;
+  }
+  return 0;
+}
+
 sub get_tmux_helper {
   my $pid = undef;
   if (open IN, "pgrep -x -P $tmux_pid $PROG | ") {
@@ -93,16 +98,8 @@ sub check_credentials {
 # We were signalled by our child which noticed that our credentials expired.
 sub want_credentials {
   # Do we already know?
-  return if defined $have_valid_credentials && $have_valid_credentials == 0;
-  $SIG{USR1} = IGNORE;
-  $have_valid_credentials = 0;
-  system "tmux", "new-window", "exec kinit";
-}
-
-# We were signalled by our child which noticed that our credentials are valid.
-sub got_credentials {
-  $have_valid_credentials = 1;
-  $SIG{USR1} = \&want_credentials;
+  return sleep 1 if &check_kinit_child;
+  system "tmux", "new-window", "-n", "Renew Kerberos credentials", "exec kinit";
 }
 
 sub cleanup {