# # This is a simple wrapper module for Python that provides # a way to access FreeBSD's sysctl interface. Example: # # from sysctl import * # print "hw.ncpu = ", sysctl_int(sysctlnametomib("hw.ncpu")) # # Copyright (c) 2010-2011 Oliver Fromme, Germany # All rights reserved. 2-clause BSD-style copyright and disclaimer # apply, plase see /usr/share/examples/etc/bsd-style-copyright on # FreeBSD machines, or ask the author for a copy. # debug = False from os import strerror from sys import stderr, exit from ctypes import * libc = CDLL("libc.so") errno = c_int.in_dll(libc, "errno") def check_fail (fail): if fail: exit (1) else: return None def sysctlnametomib (name, fail = True): mibsize = len(name.split('.')) size = c_uint(mibsize) mib = (c_int * mibsize)() if libc.sysctlnametomib(name, byref(mib), byref(size)) != 0: print >> stderr, 'sysctlnametomib("%s"):' % name, strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctlnametomib("%s") -->' % name, str(list(mib)) return mib def sysctl_numeric (type, mib, fail = True): size = c_uint(sizeof(type)) value = type(0) if libc.sysctl(byref(mib), len(mib), byref(value), byref(size), None, 0) != 0: print >> stderr, 'sysctl(%s):' % str(list(mib)), strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctl(%s) -->' % str(list(mib)), repr(value.value) return value.value def sysctl_int (mib, fail = True): return sysctl_numeric(c_int, mib, fail) def sysctl_uint (mib, fail = True): return sysctl_numeric(c_uint, mib, fail) def sysctl_long (mib, fail = True): return sysctl_numeric(c_long, mib, fail) def sysctl_ulong (mib, fail = True): return sysctl_numeric(c_ulong, mib, fail) def sysctl_numericarray (type, mib, count = None, fail = True): if count is None: size = c_uint(0) if libc.sysctl(byref(mib), len(mib), None, byref(size), None, 0) != 0: print >> stderr, 'sysctl(%s):' % str(list(mib)), strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctl(%s) --> size' % str(list(mib)), size.value count = size.value / sizeof(type) else: size = c_uint(count * sizeof(type)) value = (type * count)() if libc.sysctl(byref(mib), len(mib), byref(value), byref(size), None, 0) != 0: print >> stderr, 'sysctl(%s):' % str(list(mib)), strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctl(%s) -->' % str(list(mib)), repr(list(value)) return list(value) def sysctl_intarray (mib, count = None, fail = True): return sysctl_numericarray(c_int, mib, count, fail) def sysctl_uintarray (mib, count = None, fail = True): return sysctl_numericarray(c_uint, mib, count, fail) def sysctl_longarray (mib, count = None, fail = True): return sysctl_numericarray(c_long, mib, count, fail) def sysctl_ulongarray (mib, count = None, fail = True): return sysctl_numericarray(c_ulong, mib, count, fail) def sysctl_str (mib, fail = True): size = c_uint(0) if libc.sysctl(byref(mib), len(mib), None, byref(size), None, 0) != 0: print >> stderr, 'sysctl(%s):' % str(list(mib)), strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctl(%s) --> size' % str(list(mib)), size.value value = create_string_buffer(size.value) if libc.sysctl(byref(mib), len(mib), byref(value), byref(size), None, 0) != 0: print >> stderr, 'sysctl(%s):' % str(list(mib)), strerror(errno.value) return check_fail(fail) if debug: print >> stderr, 'sysctl(%s) -->' % str(list(mib)), repr(value.value) return value.value #--