source: trunk/debathena/debathena/python-moira/mrclient.pyx @ 24605

Revision 24605, 2.2 KB checked in by broder, 15 years ago (diff)
Snapshot new version of PyMoira that includes mrclient bindings.
Line 
1cdef extern from "moira/mrclient.h":
2    int mrcl_connect(char * server, char * client, int version, int auth)
3    char * mrcl_krb_user()
4    char * c_partial_canonicalize_hostname "partial_canonicalize_hostname" (char * s)
5    char * mrcl_get_message()
6    void mrcl_com_err(char * whoami)
7    int mrcl_validate_pobox_smtp(char * user, char * address, char ** ret)
8
9    enum:
10        MRCL_SUCCESS
11        MRCL_FAIL
12        MRCL_REJECT
13        MRCL_WARN
14        MRCL_ENOMEM
15        MRCL_MOIRA_ERROR
16        MRCL_AUTH_ERROR
17
18cdef extern from "stdlib.h":
19    void free(void * ptr)
20
21cdef extern from "string.h":
22    char * strdup(char * s)
23
24cdef public char * whoami
25
26class MoiraClientException(Exception):
27    def code(self):
28        return self.args[0]
29    code = property(code)
30
31def _error(code, text=None):
32    if code == MRCL_ENOMEM:
33        text = "Out of memory"
34    if code == MRCL_MOIRA_ERROR:
35        text = "Moira Error"
36    if code == MRCL_AUTH_ERROR:
37        text = "Authentication error"
38    if mrcl_get_message():
39        if text == None:
40            text = mrcl_get_message()
41        else:
42            text = "%s (%s)" % (text, mrcl_get_message())
43    raise MoiraClientException(code, text)
44
45def connect(server='', client='mrclient.py', version=-1, auth=1):
46    status = mrcl_connect(server, client, version, auth)
47    if status != MRCL_SUCCESS:
48       _error(status)
49    whoami = client
50   
51def krb_user():
52    cdef char * c_krb_user
53    cdef object py_krb_user
54    c_krb_user = mrcl_krb_user()
55    if c_krb_user == NULL:
56       _error(-1, "Could not retrieve principal name")
57    py_krb_user = c_krb_user
58    free(c_krb_user)
59    return py_krb_user
60
61def validate_pobox_smtp(user, address):
62    cdef char * c_retval
63    cdef object py_retval
64    py_retval = address
65    status = mrcl_validate_pobox_smtp(user, address, &c_retval)
66    if status != MRCL_SUCCESS:
67        _error(status)
68    if c_retval != NULL:
69        py_retval = c_retval
70        free(c_retval)
71    return py_retval
72
73def partial_canonicalize_hostname(host):
74    cdef object py_hostname
75    cdef char * c_hostname
76    c_hostname = c_partial_canonicalize_hostname(strdup(host))
77    py_hostname = c_hostname
78    free(c_hostname)
79    return py_hostname
80
Note: See TracBrowser for help on using the repository browser.