Update print syntax
[invirt/packages/invirt-base.git] / python / invirt / remctl.py
1 """
2 Functions to perform remctls.
3 """
4
5 import subprocess
6 import sys
7 from socket import getfqdn
8
9 from invirt.common import CodeError
10
11
12 def kinit(principal=None, keytab=None):
13     """Kinit with a given username and keytab"""
14     if principal is None:
15         principal = 'daemon/' + getfqdn()
16     if keytab is None:
17         keytab = '/etc/invirt/keytab'
18     p = subprocess.Popen(['kinit', "-k", "-t", keytab, principal],
19                          stderr=subprocess.PIPE)
20     e = p.wait()
21     if e:
22         raise CodeError("Error %s in kinit: %s" % (e, p.stderr.read()))
23
24 def checkKinit(principal=None, keytab=None):
25     """If we lack tickets, kinit."""
26     p = subprocess.Popen(['klist', '-s'])
27     if p.wait():
28         kinit(principal, keytab)
29
30 def remctl(host, *args, **kws):
31     """Perform a remctl and return the output.
32
33     kinits if necessary, and outputs errors to stderr.
34     """
35     checkKinit(kws.get('principal'), kws.get('keytab'))
36     p = subprocess.Popen(['remctl', host]
37                          + list(args),
38                          stdout=subprocess.PIPE,
39                          stderr=subprocess.PIPE)
40     stdout, stderr = p.communicate()
41     if kws.get('err'):
42         return stdout, stderr
43     if p.returncode:
44         print('Error', p.returncode, 'on remctl', args, ':', file=sys.stderr)
45         print(stderr, file=sys.stderr)
46         raise CodeError('ERROR on remctl')
47     return stdout