From aeb96cb02bc3ec6be1adea9bd5c6a1dbc0e08886 Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Fri, 26 Nov 2010 15:38:49 +0000 Subject: [PATCH] Relaunch kinit if necessary. 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 | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/opt/bin/ktmux_helper b/opt/bin/ktmux_helper index 1ed6e46..31605c8 100755 --- a/opt/bin/ktmux_helper +++ b/opt/bin/ktmux_helper @@ -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 { -- 2.20.1