1#!/usr/bin/env python3
2
3# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""
8A clone of 'ifconfig' on UNIX.
9
10$ python scripts/ifconfig.py
11lo:
12    stats          : speed=0MB, duplex=?, mtu=65536, up=yes
13    incoming       : bytes=1.95M, pkts=22158, errs=0, drops=0
14    outgoing       : bytes=1.95M, pkts=22158, errs=0, drops=0
15    IPv4 address   : 127.0.0.1
16         netmask   : 255.0.0.0
17    IPv6 address   : ::1
18         netmask   : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
19    MAC  address   : 00:00:00:00:00:00
20
21docker0:
22    stats          : speed=0MB, duplex=?, mtu=1500, up=yes
23    incoming       : bytes=3.48M, pkts=65470, errs=0, drops=0
24    outgoing       : bytes=164.06M, pkts=112993, errs=0, drops=0
25    IPv4 address   : 172.17.0.1
26         broadcast : 172.17.0.1
27         netmask   : 255.255.0.0
28    IPv6 address   : fe80::42:27ff:fe5e:799e%docker0
29         netmask   : ffff:ffff:ffff:ffff::
30    MAC  address   : 02:42:27:5e:79:9e
31         broadcast : ff:ff:ff:ff:ff:ff
32
33wlp3s0:
34    stats          : speed=0MB, duplex=?, mtu=1500, up=yes
35    incoming       : bytes=7.04G, pkts=5637208, errs=0, drops=0
36    outgoing       : bytes=372.01M, pkts=3200026, errs=0, drops=0
37    IPv4 address   : 10.0.0.2
38         broadcast : 10.255.255.255
39         netmask   : 255.0.0.0
40    IPv6 address   : fe80::ecb3:1584:5d17:937%wlp3s0
41         netmask   : ffff:ffff:ffff:ffff::
42    MAC  address   : 48:45:20:59:a4:0c
43         broadcast : ff:ff:ff:ff:ff:ff
44"""
45
46from __future__ import print_function
47import socket
48
49import psutil
50from psutil._common import bytes2human
51
52
53af_map = {
54    socket.AF_INET: 'IPv4',
55    socket.AF_INET6: 'IPv6',
56    psutil.AF_LINK: 'MAC',
57}
58
59duplex_map = {
60    psutil.NIC_DUPLEX_FULL: "full",
61    psutil.NIC_DUPLEX_HALF: "half",
62    psutil.NIC_DUPLEX_UNKNOWN: "?",
63}
64
65
66def main():
67    stats = psutil.net_if_stats()
68    io_counters = psutil.net_io_counters(pernic=True)
69    for nic, addrs in psutil.net_if_addrs().items():
70        print("%s:" % (nic))
71        if nic in stats:
72            st = stats[nic]
73            print("    stats          : ", end='')
74            print("speed=%sMB, duplex=%s, mtu=%s, up=%s" % (
75                st.speed, duplex_map[st.duplex], st.mtu,
76                "yes" if st.isup else "no"))
77        if nic in io_counters:
78            io = io_counters[nic]
79            print("    incoming       : ", end='')
80            print("bytes=%s, pkts=%s, errs=%s, drops=%s" % (
81                bytes2human(io.bytes_recv), io.packets_recv, io.errin,
82                io.dropin))
83            print("    outgoing       : ", end='')
84            print("bytes=%s, pkts=%s, errs=%s, drops=%s" % (
85                bytes2human(io.bytes_sent), io.packets_sent, io.errout,
86                io.dropout))
87        for addr in addrs:
88            print("    %-4s" % af_map.get(addr.family, addr.family), end="")
89            print(" address   : %s" % addr.address)
90            if addr.broadcast:
91                print("         broadcast : %s" % addr.broadcast)
92            if addr.netmask:
93                print("         netmask   : %s" % addr.netmask)
94            if addr.ptp:
95                print("      p2p       : %s" % addr.ptp)
96        print("")
97
98
99if __name__ == '__main__':
100    main()
101