From 2e98d858cd10ff3d4fd1e1e4fb24e5b4f7076f1b Mon Sep 17 00:00:00 2001 From: Emmanuel Hocdet Date: Fri, 8 Dec 2017 13:25:21 +0100 Subject: [PATCH 1/3] fix cursor_opt --- src/varnishapi.py | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/varnishapi.py b/src/varnishapi.py index d4aabf5..d47e0c5 100644 --- a/src/varnishapi.py +++ b/src/varnishapi.py @@ -1492,6 +1492,10 @@ def __init__(self, opt='', sopath='libvarnishapi.so.1', dataDecode=True): if len(opt) > 0: self.__setArg(opt) + if self.d_opt: + self.cursor_opt = self.defi.VSL_COPT_TAILSTOP | self.defi.VSL_COPT_BATCH + else: + self.cursor_opt = self.defi.VSL_COPT_TAIL | self.defi.VSL_COPT_BATCH if self.lva.apiversion >= 2.0: self.__Setup20() @@ -1568,13 +1572,7 @@ def __Setup20(self): return(0) #self.name = self.lva.VSM_Name(self.vsm) - if self.d_opt: - self.cursor_opt = self.defi.VSL_COPT_TAILSTOP | self.defi.VSL_COPT_BATCH - else: - self.cursor_opt = self.defi.VSL_COPT_TAIL | self.defi.VSL_COPT_BATCH - - c = self.lva.VSL_CursorVSM( - self.vsl, self.vsm, self.cursor_opt) + c = self.lva.VSL_CursorVSM(self.vsl, self.vsm, self.cursor_opt) self.lva.VSLQ_SetCursor(self.vslq, byref(cast(c, c_void_p))) self.lva.VSL_ResetError(self.vsl) @@ -1595,13 +1593,7 @@ def __Setup10(self): return(0) self.name = self.lva.VSM_Name(self.vsm) - if self.d_opt: - tail = self.defi.VSL_COPT_TAILSTOP - else: - tail = self.defi.VSL_COPT_TAIL - - c = self.lva.VSL_CursorVSM( - self.vsl, self.vsm, tail | self.defi.VSL_COPT_BATCH) + c = self.lva.VSL_CursorVSM(self.vsl, self.vsm, self.cursor_opt) if not c: self.error = "Can't open log (%s)" % self.lva.VSL_Error(self.vsl).decode("utf8", "replace") @@ -1624,9 +1616,7 @@ def __Dispatch10(self, maxread): if self.lva.VSM_Open(self.vsm): self.lva.VSM_ResetError(self.vsm) return(1) - c = self.lva.VSL_CursorVSM( - self.vsl, self.vsm, - self.defi.VSL_COPT_TAIL | self.defi.VSL_COPT_BATCH) + c = self.lva.VSL_CursorVSM(self.vsl, self.vsm, self.cursor_opt) if not c: self.lva.VSM_ResetError(self.vsm) self.lva.VSM_Close(self.vsm) From 5c1c1e57e59a8201833ccd042d7296d42f4e44cd Mon Sep 17 00:00:00 2001 From: Emmanuel Hocdet Date: Fri, 8 Dec 2017 13:30:07 +0100 Subject: [PATCH 2/3] introduce class VarnishVSM --- src/varnishapi.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/varnishapi.py b/src/varnishapi.py index d47e0c5..687dd7f 100644 --- a/src/varnishapi.py +++ b/src/varnishapi.py @@ -1310,9 +1310,6 @@ def __init__(self, sopath='libvarnishapi.so.1'): self.lib = cdll[sopath] self.lva = LIBVARNISHAPI(self.lib) self.defi = VarnishAPIDefine40() - self._cb = None - self.vsm = self.lva.VSM_New() - self.d_opt = 0 VSLTAGS = c_char_p * 256 self.VSL_tags = [] @@ -1352,6 +1349,13 @@ def VSL_DATA(self, ptr, isbin=False): data = string_at(ptr, length + 8)[8:-1].decode("utf8", "replace") return data +class VarnishVSM(VarnishAPI): + + def __init__(self, sopath='libvarnishapi.so.1'): + VarnishAPI.__init__(self, sopath) + self.vsm = self.lva.VSM_New() + self.d_opt = 0 + def ArgDefault(self, op, arg): if self.lva.apiversion >= 2.0: if op == "n": @@ -1387,10 +1391,10 @@ def Fini(self): self.vsm = 0 -class VarnishStat(VarnishAPI): +class VarnishStat(VarnishVSM): def __init__(self, opt='', sopath='libvarnishapi.so.1'): - VarnishAPI.__init__(self, sopath) + VarnishVSM.__init__(self, sopath) self.name = '' if len(opt) > 0: self.__setArg(opt) @@ -1404,7 +1408,7 @@ def __init__(self, opt='', sopath='libvarnishapi.so.1'): def Fini(self): if self.lva.apiversion >= 2.0: self.lva.VSC_Destroy(byref(cast(self.vsc, c_void_p)), self.vsm) - VarnishAPI.Fini(self) + VarnishVSM.Fini(self) def __Setup20(self): if self.lva.VSM_Attach(self.vsm, 2): @@ -1434,7 +1438,7 @@ def __setArg(self, opt): def __Arg(self, op, arg): # default - i = VarnishAPI.ArgDefault(self, op, arg) + i = VarnishVSM.ArgDefault(self, op, arg) if i is not None: return(i) @@ -1476,10 +1480,10 @@ def getStats(self): return self._buf -class VarnishLog(VarnishAPI): +class VarnishLog(VarnishVSM): def __init__(self, opt='', sopath='libvarnishapi.so.1', dataDecode=True): - VarnishAPI.__init__(self, sopath) + VarnishVSM.__init__(self, sopath) self.vut = VSLUtil() self.vsl = self.lva.VSL_New() @@ -1489,6 +1493,7 @@ def __init__(self, opt='', sopath='libvarnishapi.so.1', dataDecode=True): self.__r_arg = 0 self.name = '' self.dataDecode = dataDecode + self._cb = None if len(opt) > 0: self.__setArg(opt) @@ -1521,7 +1526,7 @@ def __setArg(self, opt): return(1) def __Arg(self, op, arg): - i = VarnishAPI.ArgDefault(self, op, arg) + i = VarnishVSM.ArgDefault(self, op, arg) if i is not None: return(i) @@ -1706,7 +1711,7 @@ def Fini(self): if self.vsl: self.lva.VSL_Delete(self.vsl) self.vsl = 0 - VarnishAPI.Fini(self) + VarnishVSM.Fini(self) def __VSL_Arg(self, opt, arg='\0'): return self.lva.VSL_Arg(self.vsl, ord(opt), arg) From d8c0d8c15741508aec83cf76c54d392237441578 Mon Sep 17 00:00:00 2001 From: Emmanuel Hocdet Date: Mon, 11 Dec 2017 17:51:26 +0100 Subject: [PATCH 3/3] add VarnishVUT interface --- src/varnishapi.py | 88 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/src/varnishapi.py b/src/varnishapi.py index 687dd7f..1c8cd34 100644 --- a/src/varnishapi.py +++ b/src/varnishapi.py @@ -34,32 +34,6 @@ -class VUT (Structure): - _fields_ = [ - ("magic" , c_uint), #unsigned magic; - ("progname" , c_char_p), #const char *progname; - ("d_opt" , c_int), #int d_opt; - ("D_opt" , c_int), #int D_opt; - ("g_arg" , c_int), #int g_arg; - ("k_arg" , c_int), #int k_arg; - ("n_arg" , c_char_p), #char *n_arg; - ("P_arg" , c_char_p), #char *P_arg; - ("q_arg" , c_char_p), #char *q_arg; - ("r_arg" , c_char_p), #char *r_arg; - ("t_arg" , c_char_p), #char *t_arg; - ("vsl" , c_void_p), #struct VSL_data *vsl; - ("vsm" , c_void_p), #struct vsm *vsm; - ("vslq" , c_void_p), #struct VSLQ *vslq; - ("sighup" , c_int), #int sighup; - ("sigint" , c_int), #int sigint; - ("sigusr1" , c_int), #int sigusr1; - ("idle_f" , c_void_p), #VUT_cb_f *idle_f; - ("sighup_f" , c_void_p), #VUT_cb_f *sighup_f; - ("error_f" , c_void_p), #VUT_error_f *error_f; - ("dispatch_f" , c_void_p), #VSLQ_dispatch_f *dispatch_f; - ("dispatch_priv" , c_void_p) #void *dispatch_priv; - ] - class VSC_level_desc(Structure): _fields_ = [ ("verbosity", c_uint), # unsigned verbosity; @@ -382,8 +356,35 @@ def __init__(self): # typedef int VUT_cb_f(struct VUT *); VUT_cb_f = CFUNCTYPE( c_int, - POINTER(VUT) + c_void_p #POINTER(VUT) ) + +class VUT (Structure): + _fields_ = [ + ("magic" , c_uint), #unsigned magic; + ("progname" , c_char_p), #const char *progname; + ("d_opt" , c_int), #int d_opt; + ("D_opt" , c_int), #int D_opt; + ("g_arg" , c_int), #int g_arg; + ("k_arg" , c_int), #int k_arg; + ("n_arg" , c_char_p), #char *n_arg; + ("P_arg" , c_char_p), #char *P_arg; + ("q_arg" , c_char_p), #char *q_arg; + ("r_arg" , c_char_p), #char *r_arg; + ("t_arg" , c_char_p), #char *t_arg; + ("vsl" , c_void_p), #struct VSL_data *vsl; + ("vsm" , c_void_p), #struct vsm *vsm; + ("vslq" , c_void_p), #struct VSLQ *vslq; + ("sighup" , c_int), #int sighup; + ("sigint" , c_int), #int sigint; + ("sigusr1" , c_int), #int sigusr1; + ("idle_f" , VUT_cb_f), #VUT_cb_f *idle_f; + ("sighup_f" , VUT_cb_f), #VUT_cb_f *sighup_f; + ("error_f" , c_void_p), #VUT_error_f *error_f; + ("dispatch_f" , VSLQ_dispatch_f), #VSLQ_dispatch_f *dispatch_f; + ("dispatch_priv" , c_void_p) #void *dispatch_priv; + ] + class LIBVARNISHAPI10: def __init__(self, lc): self.lc = lc @@ -1391,6 +1392,39 @@ def Fini(self): self.vsm = 0 +class VarnishVUT(VarnishAPI): + def __init__(self, + argc='VarnishVUTproc', + opt='', + sopath='libvarnishapi.so.1'): + VarnishAPI.__init__(self, sopath) + self.vopt_spec = vopt_spec() + self.vut = self.lva.VUT_Init(argc, 0, byref(cast('',c_char_p)), self.vopt_spec) + if len(opt) > 0: + self.__setArg(opt) + self.lva.VUT_Setup(self.vut) + self.vut[0].dispatch_f = VSLQ_dispatch_f(self._callBack) + + def stop(self): + self.vut[0].sigint = 1 + + def run(self): + self.lva.VUT_Main(self.vut) + self.lva.VUT_Fini(self.vut) + + def __setArg(self, opt): + # XXX args from vopt_spec + opts, args = getopt.getopt(opt, "bcCdx:X:r:q:N:n:I:i:g:k:t:T:") + error = 0 + for o in opts: + op = o[0].lstrip('-') + arg = o[1].encode("utf8", "replace") + self.lva.VUT_Arg(self.vut, ord(op[0]), arg) + + def _callBack(self, vsl, pt, fo): + # not implemented + return(0) + class VarnishStat(VarnishVSM): def __init__(self, opt='', sopath='libvarnishapi.so.1'):