#! /usr/bin/perl -w my $ALARMED = 0; $SIG{ALRM} = sub { ++$ALARMED; }; use POSIX qw(mktime); # Work out ticket expiry # Valid starting Expires Service principal # 11/17/11 10:34:23 11/17/11 20:34:23 krbtgt/CALVAEDI.COM@CALVAEDI.COM # renew until 11/18/11 10:34:23 # 11/17/11 10:34:23 11/17/11 20:34:23 nfs/olympic.calvaedi.com@CALVAEDI.COM # renew until 11/18/11 10:34:23 # 11/17/11 11:24:24 11/17/11 20:34:23 host/olympic.calvaedi.com@CALVAEDI.COM # renew until 11/18/11 10:34:23 # Eurgh - non localised, US format dates. sub expiry { local *KLIST; open KLIST, "/usr/bin/klist | " or return; my $expiry; while () { if (m((\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+) krbtgt)) { $expiry = mktime ($6, $5, $4, $2, $1 - 1, 100 + $3); last; } } $expiry; } for (;;) { my $sleepytime = 60; my $expiry = expiry (); if (defined $expiry) { my $left = $expiry - time; if ($left <= 0) { # Ticket expired, zap it. Potential race with # new ticket creation. print "Destroy expired ticket\n"; system "/usr/bin/kdestroy"; } else { $sleepytime = $left; } } if ($ALARMED) { $ALARMED = 0; next; } # If machine freezes during this sleap how long will # it sleep for? print "Sleeping for $sleepytime seconds\n"; sleep $sleepytime; }