Skip to content
forked from ManuelMcLure/libnl

Pure Python port of the Netlink protocol library suite.

License

Notifications You must be signed in to change notification settings

coolshou/libnl3

 
 

Repository files navigation

libnl

A port of libnl, a collection of libraries providing APIs to the Netlink protocol based Linux kernel interfaces. This library is API-equivalent to the original C library, and should make it relatively easy to convert C programs into pure Python without having to call external binaries.

As Netlink is a Linux-specific protocol, this library will only work on Linux hosts. All communication is done using sockets between the Python process and the Linux kernel. The main driver for porting libnl3 was to use nl80211 in Python to scan for wireless access points natively, without having to run an external program and parse its output.

  • Python PyPy3, 3.7, and 3.8 supported on Linux.
Build Status WiFi Build Status Coverage Status Latest Version Downloads

Quickstart

Install:

pip install libnl

Example Implementations

A simple Python program that merely lists network adapters on the host:

import ctypes
import socket

from libnl3.error import errmsg
from libnl3.handlers import NL_CB_CUSTOM, NL_CB_VALID, NL_OK
from libnl3.linux_private.if_link import IFLA_IFNAME, IFLA_RTA
from libnl3.linux_private.netlink import NETLINK_ROUTE, NLMSG_LENGTH, NLM_F_DUMP, NLM_F_REQUEST
from libnl3.linux_private.rtnetlink import RTA_DATA, RTA_NEXT, RTA_OK, RTM_GETLINK, ifinfomsg, rtgenmsg
from libnl3.misc import get_string
from libnl3.msg import nlmsg_data, nlmsg_hdr
from libnl3.nl import nl_connect, nl_recvmsgs_default, nl_send_simple
from libnl3.socket_ import nl_socket_alloc, nl_socket_modify_cb


def callback(msg, _):
    nlh = nlmsg_hdr(msg)
    iface = ifinfomsg(nlmsg_data(nlh))
    hdr = IFLA_RTA(iface)
    remaining = ctypes.c_int(nlh.nlmsg_len - NLMSG_LENGTH(iface.SIZEOF))
    while RTA_OK(hdr, remaining):
        if hdr.rta_type == IFLA_IFNAME:
            print('Found interface {0}: {1}'.format(iface.ifi_index, get_string(RTA_DATA(hdr)).decode('ascii')))
        hdr = RTA_NEXT(hdr, remaining)
    return NL_OK


sk = nl_socket_alloc()  # Creates an nl_sock instance.
ret = nl_connect(sk, NETLINK_ROUTE)  # Create file descriptor and bind socket.
if ret < 0:
    raise RuntimeError('nl_connect() returned {0} ({1})'.format(ret, errmsg[abs(ret)]))
rt_hdr = rtgenmsg(rtgen_family=socket.AF_PACKET)
ret = nl_send_simple(sk, RTM_GETLINK, NLM_F_REQUEST | NLM_F_DUMP, rt_hdr, rt_hdr.SIZEOF)
if ret < 0:
    raise RuntimeError('nl_send_simple() returned {0} ({1})'.format(ret, errmsg[abs(ret)]))
nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM, callback, None)  # Add callback to the nl_sock instance.
ret = nl_recvmsgs_default(sk)  # Get kernel's answer, and call attached callbacks.
if ret < 0:
    raise RuntimeError('nl_recvmsgs_default() returned {0} ({1})'.format(ret, errmsg[abs(ret)]))

Here are some more examples with their C equivalents in order from "easy" to "hard":

BUILD whl package

# whl file will place in dist/ folder

`bash python3 -m pip install --user --upgrade setuptools wheel python3 setup.py sdist bdist_wheel python3 -m build `

Changelog

This project adheres to Semantic Versioning.

0.3.1 - 2021-02-05

  • Fix python 3.8 error

0.3.0 - 2021-02-05

  • Fix python 3.6 error
  • Fix continue dump when no NL_CB_DUMP_INTR

0.2.0 - 2015-03-26

Added

  • Python2.6, PyPy, and PyPy3 support.

0.1.1 - 2015-03-15

  • Initial release.

About

Pure Python port of the Netlink protocol library suite.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 95.9%
  • C 3.9%
  • Makefile 0.2%