vlan
By: a guest | Dec 8th, 2009 | Syntax:
Python | Size: 1.20 KB | Hits: 247 | Expires: Never
# -*- coding: utf-8 -*-
# Copyright (c) 2009 Andrey Vlasovskikh
from __future__ import with_statement
import os, socket, errno
from itertools import imap
from contextlib import closing
from pprint import pformat
NETLINK_KOBJECT_UEVENT = 15
UEVENT_DEFAULT_GROUP = 0
def parse_message(data):
'bytes -> (bytes, {bytes: bytes})'
lines = data.split('\x00')
name = lines[0]
attrs = dict(tuple(x.split('=', 1)) for x in lines[1:] if x != '')
return (name, attrs)
def make_socket(group):
'int -> socket'
s = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM,
NETLINK_KOBJECT_UEVENT)
try:
s.bind((os.getpid(), netlink_group(group)))
return s
except:
s.close()
raise
def recv_msgs(s):
'socket -> Iterable((bytes, {bytes: bytes}))'
BUFSIZE = 65536
return imap(parse_message, iter(lambda: s.recv(BUFSIZE), ''))
def netlink_group(n):
'int -> int'
return 1 << n
def main():
with closing(make_socket(UEVENT_DEFAULT_GROUP)) as s:
for msg in recv_msgs(s):
print pformat(msg)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass