Checking the Status of a Unix Network Interface
Credit: Jürgen Hermann
Problem
You need to check the status of a network interface on a Linux or other Unix-compatible platform.
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)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) ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access