2 Functions to perform remctls.
5 from __future__ import absolute_import
6 from __future__ import print_function
7 from invirt.common import CodeError
10 from socket import getfqdn
12 def kinit(principal=None, keytab=None):
13 """Kinit with a given username and keytab"""
15 principal = 'daemon/' + getfqdn()
17 keytab = '/etc/invirt/keytab'
18 p = subprocess.Popen(['kinit', "-k", "-t", keytab, principal],
19 stderr=subprocess.PIPE)
22 raise CodeError("Error %s in kinit: %s" % (e, p.stderr.read()))
24 def checkKinit(principal=None, keytab=None):
25 """If we lack tickets, kinit."""
26 p = subprocess.Popen(['klist', '-s'])
28 kinit(principal, keytab)
30 def remctl(host, *args, **kws):
31 """Perform a remctl and return the output.
33 kinits if necessary, and outputs errors to stderr.
35 checkKinit(kws.get('principal'), kws.get('keytab'))
36 p = subprocess.Popen(['remctl', host]
38 stdout=subprocess.PIPE,
39 stderr=subprocess.PIPE)
40 stdout, stderr = p.communicate()
44 print('Error', p.returncode, 'on remctl', args, ':', file=sys.stderr)
45 print(stderr, file=sys.stderr)
46 raise CodeError('ERROR on remctl')