Changeset 256 for etherws


Ignore:
Timestamp:
10/10/13 00:43:48 (11 years ago)
Author:
atzm
Message:

setif support for netdev

File:
1 edited

Legend:

Unmodified
Added
Removed
  • etherws/trunk/etherws.py

    r255 r256  
    4646import base64 
    4747import socket 
     48import struct 
    4849import urllib2 
    4950import hashlib 
     
    271272    def _del_privattr(self, name, obj): 
    272273        return delattr(obj, self._privattr(name)) 
     274 
     275 
     276class NetworkInterface(object): 
     277    SIOCGIFADDR = 0x8915  # from <linux/sockios.h> 
     278    SIOCSIFADDR = 0x8916 
     279    SIOCGIFNETMASK = 0x891b 
     280    SIOCSIFNETMASK = 0x891c 
     281    SIOCGIFMTU = 0x8921 
     282    SIOCSIFMTU = 0x8922 
     283 
     284    def __init__(self, ifname): 
     285        self._ifname = struct.pack('16s', str(ifname)[:15]) 
     286 
     287    def _ioctl(self, req, data): 
     288        try: 
     289            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     290            return fcntl.ioctl(sock.fileno(), req, data) 
     291        finally: 
     292            sock.close() 
     293 
     294    @property 
     295    def address(self): 
     296        try: 
     297            data = struct.pack('16s18x', self._ifname) 
     298            ret = self._ioctl(self.SIOCGIFADDR, data) 
     299            return socket.inet_ntoa(ret[20:24]) 
     300        except IOError: 
     301            return '' 
     302 
     303    @property 
     304    def netmask(self): 
     305        try: 
     306            data = struct.pack('16s18x', self._ifname) 
     307            ret = self._ioctl(self.SIOCGIFNETMASK, data) 
     308            return socket.inet_ntoa(ret[20:24]) 
     309        except IOError: 
     310            return '' 
     311 
     312    @property 
     313    def mtu(self): 
     314        try: 
     315            data = struct.pack('16s18x', self._ifname) 
     316            ret = self._ioctl(self.SIOCGIFMTU, data) 
     317            return struct.unpack('i', ret[16:20])[0] 
     318        except IOError: 
     319            return 0 
     320 
     321    @address.setter 
     322    def address(self, addr): 
     323        data = struct.pack('16si4s10x', self._ifname, socket.AF_INET, 
     324                           socket.inet_aton(addr)) 
     325        self._ioctl(self.SIOCSIFADDR, data) 
     326 
     327    @netmask.setter 
     328    def netmask(self, addr): 
     329        data = struct.pack('16si4s10x', self._ifname, socket.AF_INET, 
     330                           socket.inet_aton(addr)) 
     331        self._ioctl(self.SIOCSIFNETMASK, data) 
     332 
     333    @mtu.setter 
     334    def mtu(self, mtu): 
     335        data = struct.pack('16si12x', self._ifname, mtu) 
     336        self._ioctl(self.SIOCSIFMTU, data) 
    273337 
    274338 
     
    478542        if self.closed: 
    479543            raise ValueError('I/O operation on closed netdev') 
    480         return '' 
     544        return NetworkInterface(self.target).address 
    481545 
    482546    @property 
     
    484548        if self.closed: 
    485549            raise ValueError('I/O operation on closed netdev') 
    486         return '' 
     550        return NetworkInterface(self.target).netmask 
    487551 
    488552    @property 
     
    490554        if self.closed: 
    491555            raise ValueError('I/O operation on closed netdev') 
    492         return '' 
     556        return NetworkInterface(self.target).mtu 
    493557 
    494558    @address.setter 
     
    496560        if self.closed: 
    497561            raise ValueError('I/O operation on closed netdev') 
    498         raise NotImplementedError('unsupported') 
     562        NetworkInterface(self.target).address = address 
    499563 
    500564    @netmask.setter 
     
    502566        if self.closed: 
    503567            raise ValueError('I/O operation on closed netdev') 
    504         raise NotImplementedError('unsupported') 
     568        NetworkInterface(self.target).netmask = netmask 
    505569 
    506570    @mtu.setter 
     
    508572        if self.closed: 
    509573            raise ValueError('I/O operation on closed netdev') 
    510         raise NotImplementedError('unsupported') 
     574        NetworkInterface(self.target).mtu = mtu 
    511575 
    512576    def open(self): 
Note: See TracChangeset for help on using the changeset viewer.