File: ip.py

package info (click to toggle)
xen-3.0 3.0.3-0-2
  • links: PTS
  • area: main
  • in suites: etch-m68k
  • size: 31,772 kB
  • ctags: 70,362
  • sloc: ansic: 417,153; python: 28,855; asm: 23,892; sh: 5,157; makefile: 4,830; objc: 613; perl: 372; xml: 351
file content (121 lines) | stat: -rw-r--r-- 3,175 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import os
import re
import socket
import struct
import errno

##### Networking-related functions

def get_defaultroute():
    fd = os.popen('/sbin/ip route list 2>/dev/null')
    for line in fd.readlines():
        m = re.search('^default via ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) dev ([^ ]*)',
                      line)
        if m:
            return [m.group(1), m.group(2)]
    return [None, None]

def get_current_ipaddr(dev='defaultroute'):
    """Get the primary IP address for the given network interface.

    dev     network interface (default: default route device)

    returns interface address as a string
    """
    if dev == 'defaultroute':
        dev = get_defaultroute()[1]
    if not dev:
        return
    fd = os.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' )
    for line in fd.readlines():
        m = re.search( '^\s+inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*',
                       line )
        if m:
            return m.group(1)
    return None

def get_current_ipmask(dev='defaultroute'):
    """Get the primary IP netmask for a network interface.

    dev     network interface (default: default route device)

    returns interface netmask as a string
    """
    if dev == 'defaultroute':
        dev = get_defaultroute()[1]
    if not dev:
        return
    fd = os.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' )
    for line in fd.readlines():
        m = re.search( '^.+Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*',
                       line )
        if m:
            return m.group(1)
    return None

def get_current_ipgw(dev='defaultroute'):
    """Get the IP gateway for a network interface.

    dev     network interface (default: default route device)

    returns gateway address as a string
    """
    if dev == 'defaultroute':
        return get_defaultroute()[0]
    if not dev:
        return
    fd = os.popen( '/sbin/route -n' )
    for line in fd.readlines():
        m = re.search( '^\S+\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' +
                       '\s+\S+\s+\S*G.*' + dev + '.*', line )
        if m:
            return m.group(1)
    return None

def inet_aton(addr):
    """Convert an IP addr in IPv4 dot notation into an int.

    addr    IP address as a string

    returns integer
    """
    b = socket.inet_aton(addr)
    return struct.unpack('!I', b)[0]

def inet_ntoa(n):
    """Convert an int into an IP addr in IPv4 dot notation.

    n       IP address

    returns string
    """
    b = struct.pack('!I', n)
    return socket.inet_ntoa(b)

def add_offset_to_ip(addr, offset):
    """Add a numerical offset to an IP addr in IPv4 dot notation.

    addr    IP address
    offset  offset to add

    returns new address
    """
    n = inet_aton(addr)
    n += offset
    return inet_ntoa(n)

def check_subnet( ip, network, netmask ):
    """Check if an IP address is in the subnet defined by
    a network address and mask'.

    ip      IP adress
    network network address
    netmask network mask
    
    returns 1 if it is in the subnet, 0 if not
    """
    n_ip = inet_aton(ip)
    n_net = inet_aton(network)
    n_mask = inet_aton(netmask)
    return (n_ip & n_mask) == (n_net & n_mask)