diff options
Diffstat (limited to 'qpid/cpp/management/python/lib/qlslibs/utils.py')
-rw-r--r-- | qpid/cpp/management/python/lib/qlslibs/utils.py | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/qpid/cpp/management/python/lib/qlslibs/utils.py b/qpid/cpp/management/python/lib/qlslibs/utils.py deleted file mode 100644 index dfa760a839..0000000000 --- a/qpid/cpp/management/python/lib/qlslibs/utils.py +++ /dev/null @@ -1,216 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -""" -Module: qlslibs.utils - -Contains helper functions for qpid_qls_analyze. -""" - -import os -import qlslibs.jrnl -import stat -import string -import struct -import subprocess -import zlib - -DEFAULT_DBLK_SIZE = 128 -DEFAULT_SBLK_SIZE = 4096 # 32 dblks -DEFAULT_SBLK_SIZE_KB = DEFAULT_SBLK_SIZE / 1024 -DEFAULT_RECORD_VERSION = 2 -DEFAULT_HEADER_SIZE_SBLKS = 1 - -def adler32(data): - """return the adler32 checksum of data""" - return zlib.adler32(data) & 0xffffffff - -def create_record(magic, uflags, journal_file, record_id, dequeue_record_id, xid, data): - """Helper function to construct a record with xid, data (where applicable) and consistent tail with checksum""" - record_class = qlslibs.jrnl.CLASSES.get(magic[-1]) - record = record_class(0, magic, DEFAULT_RECORD_VERSION, uflags, journal_file.file_header.serial, record_id) - xid_length = len(xid) if xid is not None else 0 - if isinstance(record, qlslibs.jrnl.EnqueueRecord): - data_length = len(data) if data is not None else 0 - record.init(None, xid_length, data_length) - elif isinstance(record, qlslibs.jrnl.DequeueRecord): - record.init(None, dequeue_record_id, xid_length) - elif isinstance(record, qlslibs.jrnl.TransactionRecord): - record.init(None, xid_length) - else: - raise qlslibs.err.InvalidClassError(record.__class__.__name__) - if xid is not None: - record.xid = xid - record.xid_complete = True - if data is not None: - record.data = data - record.data_complete = True - record.record_tail = _mk_record_tail(record) - return record - -def efp_directory_size(directory_name): - """"Decode the directory name in the format NNNk to a numeric size, where NNN is a number string""" - try: - if directory_name[-1] == 'k': - return int(directory_name[:-1]) - except ValueError: - pass - return 0 - -def format_data(data, data_size=None, show_data_flag=True, txtest_flag=False): - """Format binary data for printing""" - return _format_binary(data, data_size, show_data_flag, 'data', qlslibs.err.DataSizeError, False, txtest_flag) - -def format_xid(xid, xid_size=None, show_xid_flag=True): - """Format binary XID for printing""" - return _format_binary(xid, xid_size, show_xid_flag, 'xid', qlslibs.err.XidSizeError, True, False) - -def get_avail_disk_space(path): - df_proc = subprocess.Popen(["df", path], stdout=subprocess.PIPE) - output = df_proc.communicate()[0] - return int(output.split('\n')[1].split()[3]) - -def has_write_permission(path): - stat_info = os.stat(path) - return bool(stat_info.st_mode & stat.S_IRGRP) - -def inv_str(in_string): - """Perform a binary 1's compliment (invert all bits) on a binary string""" - istr = '' - for index in range(0, len(in_string)): - istr += chr(~ord(in_string[index]) & 0xff) - return istr - -def load(file_handle, klass): - """Load a record of class klass from a file""" - args = load_args(file_handle, klass) - subclass = klass.discriminate(args) - result = subclass(*args) # create instance of record - if subclass != klass: - result.init(*load_args(file_handle, subclass)) - return result - -def load_args(file_handle, klass): - """Load the arguments from class klass""" - size = struct.calcsize(klass.FORMAT) - foffs = file_handle.tell(), - fbin = file_handle.read(size) - if len(fbin) != size: - raise qlslibs.err.UnexpectedEndOfFileError(len(fbin), size, foffs, file_handle.name) - return foffs + struct.unpack(klass.FORMAT, fbin) - -def load_data(file_handle, element, element_size): - """Read element_size bytes of binary data from file_handle into element""" - if element_size == 0: - return element, True - if element is None: - element = file_handle.read(element_size) - else: - read_size = element_size - len(element) - element += file_handle.read(read_size) - return element, len(element) == element_size - -def skip(file_handle, boundary): - """Read and discard disk bytes until the next multiple of boundary""" - if not file_handle.closed: - file_handle.read(_rem_bytes_in_block(file_handle, boundary)) - -#--- protected functions --- - -def _format_binary(bin_str, bin_size, show_bin_flag, prefix, err_class, hex_num_flag, txtest_flag): - """Format binary XID for printing""" - if bin_str is None and bin_size is not None: - if bin_size > 0: - raise err_class(bin_size, len(bin_str), bin_str) - return '' - if bin_size is None: - bin_size = len(bin_str) - elif bin_size != len(bin_str): - raise err_class(bin_size, len(bin_str), bin_str) - out_str = '%s(%d)' % (prefix, bin_size) - if txtest_flag: - out_str += '=\'%s\'' % _txtest_msg_str(bin_str) - elif show_bin_flag: - if _is_printable(bin_str): - binstr = '"%s"' % _split_str(bin_str) - elif hex_num_flag: - binstr = '0x%s' % _str_to_hex_num(bin_str) - else: - binstr = _hex_split_str(bin_str, 50, 10, 10) - out_str += '=\'%s\'' % binstr - return out_str - -def _hex_str(in_str, begin, end): - """Return a binary string as a hex string""" - hstr = '' - for index in range(begin, end): - if _is_printable(in_str[index]): - hstr += in_str[index] - else: - hstr += '\\%02x' % ord(in_str[index]) - return hstr - -def _hex_split_str(in_str, split_size, head_size, tail_size): - """Split a hex string into two parts separated by an ellipsis""" - if len(in_str) <= split_size: - return _hex_str(in_str, 0, len(in_str)) - return _hex_str(in_str, 0, head_size) + ' ... ' + _hex_str(in_str, len(in_str)-tail_size, len(in_str)) - -def _txtest_msg_str(bin_str): - """Extract the message number used in qpid-txtest""" - msg_index = bin_str.find('msg') - if msg_index >= 0: - end_index = bin_str.find('\x00', msg_index) - assert end_index >= 0 - return bin_str[msg_index:end_index] - return None - -def _is_printable(in_str): - """Return True if in_str in printable; False otherwise.""" - for this_char in in_str: - if this_char not in string.letters and this_char not in string.digits and this_char not in string.punctuation: - return False - return True - -def _mk_record_tail(record): - record_tail = qlslibs.jrnl.RecordTail(None) - record_tail.xmagic = inv_str(record.magic) - record_tail.checksum = adler32(record.checksum_encode()) - record_tail.serial = record.serial - record_tail.record_id = record.record_id - return record_tail - -def _rem_bytes_in_block(file_handle, block_size): - """Return the remaining bytes in a block""" - foffs = file_handle.tell() - return (_size_in_blocks(foffs, block_size) * block_size) - foffs - -def _size_in_blocks(size, block_size): - """Return the size in terms of data blocks""" - return int((size + block_size - 1) / block_size) - -def _split_str(in_str, split_size = 50): - """Split a string into two parts separated by an ellipsis if it is longer than split_size""" - if len(in_str) < split_size: - return in_str - return in_str[:25] + ' ... ' + in_str[-25:] - -def _str_to_hex_num(in_str): - """Turn a string into a hex number representation, little endian assumed (ie LSB is first, MSB is last)""" - return ''.join(x.encode('hex') for x in reversed(in_str)) |