7.5 Checking the Status of a Unix Network Interface


Credit: Jürgen Hermann

7.5.1 Problem

You need to check the status of a network interface on a Linux or other Unix-compatible platform.

7.5.2 Solution

One approach to system-administration scripts is to dig down into system internals, and Python supports this approach:

#! /usr/bin/env python import fcntl, struct, sys from socket import * # Set some symbolic constants SIOCGIFFLAGS = 0x8913 null256 = '\0'*256 # Get the interface name from the command line ifname = sys.argv[1] # Create a socket so we have a handle to query s = socket(AF_INET, SOCK_DGRAM) # Call ioctl(  ) to get the flags for the given interface result = fcntl.ioctl(s.fileno(  ), SIOCGIFFLAGS, ifname + null256) # Extract the interface's flags from the return value flags, = struct.unpack('H', result[16:18]) # Check "UP" bit and print a message up = flags & 1 print ('DOWN', 'UP')[up] # Return a value suitable for shell's "if" sys.exit(not up)

7.5.3 Discussion

This recipe shows how to call some of the low-level modules of Python's standard library, handling their results with the struct module. To really understand how this recipe works, you need to take a look at the system includes. On Linux, the necessary definitions are located in /usr/include/linux/if.h.

Though this code is certainly more complex than the traditional scripting approach (i.e., running /sbin/ifconfig and parsing its output), you get two positive effects in return. Directly using the system calls avoids the overhead (albeit modest) of spawning a new process for such a simple query, and you are not dependent on the output format of ifconfig, which might change over time (or from system to system) and break your code. On the other hand, of course, you are dependent on the format of the structure returned by ioctl, which may be a bit more stable than ifconfig's text output but no more widespread. Win some, lose some. It is nice (and crucial) that Python gives you a choice!

7.5.4 See Also

Documentation of the standard library modules fcntl and socket in the Library Reference; Unix manpages for the details of the network interfaces, such as ioctl and fcntl.



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net