"Daniel P. Berrange" <berrange(a)redhat.com> wrote:
This adds a binding for the virConnectOpenAuth() api in the python
API. This allows a python function to be used as the callback.
This short example code illustrates the use of the API from a
python app which wants to support username/password credentials
only.
from getpass import getpass
mydata = "Hello"
def getCred(creds, data):
print "yes"
print str(creds)
for cred in creds:
print cred[1] + ": ",
if cred[0] == libvirt.VIR_CRED_AUTHNAME:
data = sys.stdin.readline()
data = data[0:len(data)-1]
cred[4] = data
elif cred[0] == libvirt.VIR_CRED_PASSPHRASE:
cred[4] = getpass("")
else:
return -1
return 0
uri = "qemu+tcp://localhost/system"
conn = libvirt.openAuth(uri,
[[libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_PASSPHRASE],
getCred,
mydata], 0)
print str(conn.listDefinedDomains())
Nice.
One nit:
diff -r 8a79678f789f python/libvir.c
--- a/python/libvir.c Wed Nov 28 23:01:30 2007 -0500
+++ b/python/libvir.c Wed Nov 28 23:29:40 2007 -0500
...
+static PyObject *
+libvirt_virConnectOpenAuth(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
...
+ auth.ncredtype = PyList_Size(pycredtype);
+ if (auth.ncredtype) {
+ int i;
+ auth.credtype = malloc(sizeof(int) * auth.ncredtype);
Check for malloc failure:
if (!auth.credtype)
return NULL;
+ for (i = 0 ; i < auth.ncredtype ; i++) {
+ PyObject *val;
+ val = PyList_GetItem(pycredtype, i);
+ auth.credtype[i] = (int)PyLong_AsLong(val);
+ }
+ }
+ auth.cb = pycredcb ? virConnectCredCallbackWrapper : NULL;
+ auth.cbdata = pyauth;