/usr/lib/x86_64-linux-gnu/glusterfs/python/syncdaemon/libgfchangelog.py is in glusterfs-common 3.8.8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #
# Copyright (c) 2011-2014 Red Hat, Inc. <http://www.redhat.com>
# This file is part of GlusterFS.
# This file is licensed to you under your choice of the GNU Lesser
# General Public License, version 3 or any later version (LGPLv3 or
# later), or the GNU General Public License, version 2 (GPLv2), in all
# cases as published by the Free Software Foundation.
#
import os
from ctypes import CDLL, RTLD_GLOBAL, create_string_buffer, get_errno, byref, c_ulong
from ctypes.util import find_library
from syncdutils import ChangelogException, ChangelogHistoryNotAvailable
class Changes(object):
libgfc = CDLL(find_library("gfchangelog"), mode=RTLD_GLOBAL, use_errno=True)
@classmethod
def geterrno(cls):
return get_errno()
@classmethod
def raise_changelog_err(cls):
errn = cls.geterrno()
raise ChangelogException(errn, os.strerror(errn))
@classmethod
def _get_api(cls, call):
return getattr(cls.libgfc, call)
@classmethod
def cl_init(cls):
ret = cls._get_api('gf_changelog_init')(None)
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_register(cls, brick, path, log_file, log_level, retries=0):
ret = cls._get_api('gf_changelog_register')(brick, path,
log_file,
log_level, retries)
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_scan(cls):
ret = cls._get_api('gf_changelog_scan')()
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_startfresh(cls):
ret = cls._get_api('gf_changelog_start_fresh')()
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_getchanges(cls):
""" remove hardcoding for path name length """
def clsort(f):
return f.split('.')[-1]
changes = []
buf = create_string_buffer('\0', 4096)
call = cls._get_api('gf_changelog_next_change')
while True:
ret = call(buf, 4096)
if ret in (0, -1):
break
changes.append(buf.raw[:ret - 1])
if ret == -1:
cls.raise_changelog_err()
# cleanup tracker
cls.cl_startfresh()
return sorted(changes, key=clsort)
@classmethod
def cl_done(cls, clfile):
ret = cls._get_api('gf_changelog_done')(clfile)
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_history_scan(cls):
ret = cls._get_api('gf_history_changelog_scan')()
if ret == -1:
cls.raise_changelog_err()
return ret
@classmethod
def cl_history_changelog(cls, changelog_path, start, end, num_parallel):
actual_end = c_ulong()
ret = cls._get_api('gf_history_changelog')(changelog_path, start, end,
num_parallel,
byref(actual_end))
if ret == -1:
cls.raise_changelog_err()
if ret == -2:
raise ChangelogHistoryNotAvailable()
return (ret, actual_end.value)
@classmethod
def cl_history_startfresh(cls):
ret = cls._get_api('gf_history_changelog_start_fresh')()
if ret == -1:
cls.raise_changelog_err()
@classmethod
def cl_history_getchanges(cls):
""" remove hardcoding for path name length """
def clsort(f):
return f.split('.')[-1]
changes = []
buf = create_string_buffer('\0', 4096)
call = cls._get_api('gf_history_changelog_next_change')
while True:
ret = call(buf, 4096)
if ret in (0, -1):
break
changes.append(buf.raw[:ret - 1])
if ret == -1:
cls.raise_changelog_err()
return sorted(changes, key=clsort)
@classmethod
def cl_history_done(cls, clfile):
ret = cls._get_api('gf_history_changelog_done')(clfile)
if ret == -1:
cls.raise_changelog_err()
|