diff options
-rw-r--r-- | setup.py | 8 | ||||
-rw-r--r-- | src/__init__.py | 0 | ||||
-rw-r--r-- | src/_native.c (renamed from native/net_monitor.c) | 8 | ||||
-rwxr-xr-x | src/net_monitor (renamed from net_monitor) | 0 | ||||
-rw-r--r-- | src/wifi.py | 75 |
5 files changed, 84 insertions, 7 deletions
@@ -2,8 +2,8 @@ from version import * from distutils.core import setup, Extension -module1 = Extension('net_monitor', - sources=['native/net_monitor.c']) +module1 = Extension('net_monitor/_native', + sources=['src/_native.c']) setup (name='net_monitor', version=version, @@ -19,5 +19,7 @@ old net_monitor from drakx-net. It supports graphical network monitoring and some advanced features, such as network profiling, activity monitoring, detailed logging and network traffic statistics with help of vnstat reporting. """, - scripts=["net_monitor"], + packages=["net_monitor"], + package_dir = {"net_monitor": "src"}, + scripts=["src/net_monitor"], ext_modules=[module1]) diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/__init__.py diff --git a/native/net_monitor.c b/src/_native.c index 2594a65..5524c66 100644 --- a/native/net_monitor.c +++ b/src/_native.c @@ -187,7 +187,7 @@ iw_get_range_info(int skfd, const char *ifname, iwrange * range) } static PyObject * - get_max_quality(PyObject *self, PyObject *args) + wifi_get_max_quality(PyObject *self, PyObject *args) { const char *iface; int max_quality; @@ -216,14 +216,14 @@ static PyObject * /* python module details */ static PyMethodDef net_monitor_Methods[] = { - {"get_max_quality", get_max_quality, METH_VARARGS, + {"wifi_get_max_quality", wifi_get_max_quality, METH_VARARGS, "Find maximum quality value for a wireless interface."}, {NULL, NULL, 0, NULL} /* Sentinel */ }; PyMODINIT_FUNC -initnet_monitor(void) +init_native(void) { - (void) Py_InitModule("net_monitor", net_monitor_Methods); + (void) Py_InitModule("_native", net_monitor_Methods); } diff --git a/net_monitor b/src/net_monitor index fc05f2d..fc05f2d 100755 --- a/net_monitor +++ b/src/net_monitor diff --git a/src/wifi.py b/src/wifi.py new file mode 100644 index 0000000..28e06a6 --- /dev/null +++ b/src/wifi.py @@ -0,0 +1,75 @@ +#!/usr/bin/python +"""net_monitor: wifi monitoring""" + +# native librari implements a few bits +import _native +import socket +import fcntl +import struct +import traceback +import array + + +class Wireless: + # based on http://svn.pardus.org.tr/pardus/tags/pardus-1.0/system/base/wireless-tools/comar/link.py + + # wireless IOCTL constants + SIOCGIWMODE = 0x8B07 # get operation mode + SIOCGIWRATE = 0x8B21 # get default bit rate + SIOCGIWESSID = 0x8B1B # get essid + + # wireless modes + modes = ['Auto', 'Ad-Hoc', 'Managed', 'Master', 'Repeat', 'Second', 'Monitor'] + + def __init__(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + def ioctl(self, func, params): + return fcntl.ioctl(self.sock.fileno(), func, params) + + def get_max_quality(self, iface): + """Gets maximum quality value""" + return _native.wifi_get_max_quality(iface) + + def call(self, iface, func, arg=None): + if not arg: + data = (iface + '\0' * 32)[:32] + else: + data = (iface + '\0' * 16)[:16] + arg + try: + res = self.ioctl(func, data) + return res + except: + traceback.print_exc() + return None + + def get_essid(self, iface): + """Get current essid for an interface""" + buffer = array.array('c', '\0' * 16) + addr, length = buffer.buffer_info() + arg = struct.pack('Pi', addr, length) + self.call(iface, self.SIOCGIWESSID, arg) + return buffer.tostring().strip('\0') + + def get_mode(self, iface): + """Get current mode from an interface""" + result = self.call(iface, self.SIOCGIWMODE) + mode = struct.unpack("i", result[16:20])[0] + return self.modes[mode] + + def get_bitrate(self, iface): + """Gets current operating rate from an interface""" + # Note: KILO is not 2^10 in wireless tools world + + result = self.call(iface, self.SIOCGIWRATE) + + if result: + size = struct.calcsize('ihbb') + m, e, i, pad = struct.unpack('ihbb', result[16:16+size]) + if e == 0: + bitrate = m + else: + bitrate = float(m) * 10**e + return bitrate + else: + return -1 |