Share Pastebin
Guest
Public paste!

vlan

By: a guest | Dec 8th, 2009 | Syntax: Python | Size: 1.20 KB | Hits: 247 | Expires: Never
This paste has a previous version, view the difference. Copy text to clipboard
  1. # -*- coding: utf-8 -*-
  2. # Copyright (c) 2009 Andrey Vlasovskikh
  3.  
  4. from __future__ import with_statement
  5. import os, socket, errno
  6. from itertools import imap
  7. from contextlib import closing
  8. from pprint import pformat
  9.  
  10. NETLINK_KOBJECT_UEVENT = 15
  11. UEVENT_DEFAULT_GROUP = 0
  12.  
  13. def parse_message(data):
  14.     'bytes -> (bytes, {bytes: bytes})'
  15.     lines = data.split('\x00')
  16.     name = lines[0]
  17.     attrs = dict(tuple(x.split('=', 1)) for x in lines[1:] if x != '')
  18.     return (name, attrs)
  19.  
  20. def make_socket(group):
  21.     'int -> socket'
  22.     s = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM,
  23.         NETLINK_KOBJECT_UEVENT)
  24.     try:
  25.         s.bind((os.getpid(), netlink_group(group)))
  26.         return s
  27.     except:
  28.         s.close()
  29.         raise
  30.  
  31. def recv_msgs(s):
  32.     'socket -> Iterable((bytes, {bytes: bytes}))'
  33.     BUFSIZE = 65536
  34.     return imap(parse_message, iter(lambda: s.recv(BUFSIZE), ''))
  35.  
  36. def netlink_group(n):
  37.     'int -> int'
  38.     return 1 << n
  39.  
  40. def main():
  41.     with closing(make_socket(UEVENT_DEFAULT_GROUP)) as s:
  42.         for msg in recv_msgs(s):
  43.             print pformat(msg)
  44.  
  45. if __name__ == '__main__':
  46.     try:
  47.         main()
  48.     except KeyboardInterrupt:
  49.         pass