in auth/kerberos/src/krb.cpp [356:420]
bool is_ticket_ready_for_renewal( krb_ticket_info_t* krb_ticket_info, CF_logger& cf_logger )
{
std::string cmd = "export KRB5CCNAME=" + krb_ticket_info->krb_file_path + " && klist";
std::pair<int, std::string> krb_ticket_info_result = Util::exec_shell_cmd( cmd );
if ( krb_ticket_info_result.first != 0 )
{
// we need to check if meta file exists to recreate the ticket
std::cerr << Util::getCurrentTime() << '\t' << "ERROR: klist failed for command " << cmd
<< std::endl;
return false;
}
std::vector<std::string> results;
results = Util::split_string( krb_ticket_info_result.second, '#' );
std::string renew_until = "renew until";
bool is_ready_for_renewal = false;
for ( auto& result : results )
{
auto found = result.find( renew_until );
if ( found != std::string::npos )
{
std::string renewal_date_time;
renewal_date_time = get_ticket_expiration( result, cf_logger );
char renewal_date[80];
char renewal_time[80];
sscanf( renewal_date_time.c_str(), "%79s %79s", renewal_date, renewal_time );
renew_until = std::string( renewal_date ) + " " + std::string( renewal_time );
// trim extra spaces
Util::ltrim( renew_until );
Util::rtrim( renew_until );
// next renewal time for the ticket
struct tm tm;
// if the string is not date time format, return false
if ( strptime( renew_until.c_str(), "%m/%d/%Y %T", &tm ) == NULL )
return false;
std::time_t next_renewal_time = mktime( &tm );
// get the current system time
std::time_t t = std::time( NULL );
std::tm* now = std::localtime( &t );
std::time_t current_time = mktime( now );
// calculate the time difference in hours
double hours = std::difftime( next_renewal_time, current_time ) / SECONDS_IN_HOUR;
// check of the ticket need to be renewed
if ( hours <= RENEW_TICKET_HOURS )
{
is_ready_for_renewal = true;
}
break;
}
}
return is_ready_for_renewal;
}