@ -490,6 +490,18 @@ def _try_payment_stats_from_db(app):
pass
def _parse_systemctl_show ( stdout ) :
parsed = { }
for line in str ( stdout or " " ) . splitlines ( ) :
if " = " not in line :
continue
key , value = line . split ( " = " , 1 )
parsed [ key . strip ( ) ] = value . strip ( )
return parsed
def _crypto_reconcile_status ( app ) :
service_name = " otb-billing-crypto-reconcile.service "
timer_name = " otb-billing-crypto-reconcile.timer "
@ -507,16 +519,33 @@ def _crypto_reconcile_status(app):
timer_name ,
] )
last_logs = _systemctl_value ( [
service_show = _systemctl_value ( [
" show " ,
service_name ,
" --property=ActiveEnterTimestamp " ,
" --property=InactiveEnterTimestamp " ,
" --property=ExecMainStatus " ,
" --property=Result " ,
" --property=NRestarts " ,
" --no-pager " ,
] )
parsed = _parse_systemctl_show ( service_show [ " stdout " ] )
active_entered = parsed . get ( " ActiveEnterTimestamp " ) or " "
inactive_entered = parsed . get ( " InactiveEnterTimestamp " ) or " "
result = parsed . get ( " Result " ) or " unknown "
exec_status = parsed . get ( " ExecMainStatus " ) or " unknown "
# For a oneshot timer service, InactiveEnterTimestamp is usually the useful
# "last completed" timestamp. Fall back to ActiveEnterTimestamp if needed.
last_run = inactive_entered
if not last_run or last_run . lower ( ) in ( " n/a " , " never " ) :
last_run = active_entered
if not last_run :
last_run = " unknown "
return {
" service_name " : service_name ,
" timer_name " : timer_name ,
@ -525,7 +554,10 @@ def _crypto_reconcile_status(app):
" service_active " : service_active [ " stdout " ] or " unknown " ,
" service_enabled " : service_enabled [ " stdout " ] or " unknown " ,
" timer_line " : timer_list [ " stdout " ] ,
" service_details " : last_logs [ " stdout " ] ,
" service_details " : service_show [ " stdout " ] ,
" last_run " : last_run ,
" last_result " : result ,
" last_exit_status " : exec_status ,
" payment_stats " : _try_payment_stats_from_db ( app ) ,
}