invirt-base (0.0.9) unstable; urgency=low
* Move useful Python exceptions into invirt.common
+ * Move the remctl code out of the website and into invirt-base
- -- Evan Broder <broder@mit.edu> Tue, 11 Nov 2008 00:32:19 -0500
+ -- Evan Broder <broder@mit.edu> Tue, 11 Nov 2008 01:14:42 -0500
invirt-base (0.0.8) unstable; urgency=low
--- /dev/null
+"""
+Functions to perform remctls.
+"""
+
+from invirt.common import CodeError
+import subprocess
+
+def kinit():
+ """Kinit with a given username and keytab"""
+ p = subprocess.Popen(['kinit', "-k", "-t", '/etc/invirt/keytab',
+ 'daemon/'+config.web.hostname],
+ stderr=subprocess.PIPE)
+ e = p.wait()
+ if e:
+ raise CodeError("Error %s in kinit: %s" % (e, p.stderr.read()))
+
+def checkKinit():
+ """If we lack tickets, kinit."""
+ p = subprocess.Popen(['klist', '-s'])
+ if p.wait():
+ kinit()
+
+def remctl(*args, **kws):
+ """Perform a remctl and return the output.
+
+ kinits if necessary, and outputs errors to stderr.
+ """
+ checkKinit()
+ p = subprocess.Popen(['remctl', config.remote.hostname]
+ + list(args),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ v = p.wait()
+ if kws.get('err'):
+ return p.stdout.read(), p.stderr.read()
+ if v:
+ print >> sys.stderr, 'Error', v, 'on remctl', args, ':'
+ print >> sys.stderr, p.stderr.read()
+ raise CodeError('ERROR on remctl')
+ return p.stdout.read()