src/ab/plugins/kerberos.py (40 lines of code) (raw):
import sys
import subprocess
from threading import Thread, Event
from ab.utils import logger
kerberos_inited = False
from threading import Timer
class LiveTimer(Timer):
def run(self):
while True:
self.finished.wait(self.interval)
if not self.finished.is_set():
self.function(*self.args, **self.kwargs)
else:
break
def init_kerberos(config):
if not config.KERBEROS:
logger.info('no config.KERBEROS found, kerberos uninitialized')
return
kinit(**config.KERBEROS)
global kerberos_inited
kerberos_inited = True
def _inner_kinit(cmd, input):
logger.info('kerberos:', cmd)
# check=True: raise CalledProcessError if rc != 0
# alway returns 0 on success
for i in range(3):
try:
return subprocess.run(cmd, input=input, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
check=True).returncode
except Exception as e:
if i == 2:
raise
def kinit(principal, keytab: str = None, password: str = None, refresh_interval_in_seconds=3600):
"""
always return 0
raise CalledProcessError on error
"""
assert (keytab and not password) or (password and not keytab), 'kinit need either keytab or password'
cmd = ['kinit', principal]
input = password.encode() if password else None
if keytab:
cmd.extend(['-kt', keytab])
timer = LiveTimer(refresh_interval_in_seconds, _inner_kinit, kwargs={'cmd': cmd, 'input': input})
timer.daemon = True
timer.start()
return _inner_kinit(cmd, input)