| #!/usr/bin/env python3 |
| |
| # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """A clone of 'ifconfig' on UNIX. |
| |
| $ python3 scripts/ifconfig.py |
| lo: |
| stats : speed=0MB, duplex=?, mtu=65536, up=yes |
| incoming : bytes=1.95M, pkts=22158, errs=0, drops=0 |
| outgoing : bytes=1.95M, pkts=22158, errs=0, drops=0 |
| IPv4 address : 127.0.0.1 |
| netmask : 255.0.0.0 |
| IPv6 address : ::1 |
| netmask : ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff |
| MAC address : 00:00:00:00:00:00 |
| |
| docker0: |
| stats : speed=0MB, duplex=?, mtu=1500, up=yes |
| incoming : bytes=3.48M, pkts=65470, errs=0, drops=0 |
| outgoing : bytes=164.06M, pkts=112993, errs=0, drops=0 |
| IPv4 address : 172.17.0.1 |
| broadcast : 172.17.0.1 |
| netmask : 255.255.0.0 |
| IPv6 address : fe80::42:27ff:fe5e:799e%docker0 |
| netmask : ffff:ffff:ffff:ffff:: |
| MAC address : 02:42:27:5e:79:9e |
| broadcast : ff:ff:ff:ff:ff:ff |
| |
| wlp3s0: |
| stats : speed=0MB, duplex=?, mtu=1500, up=yes |
| incoming : bytes=7.04G, pkts=5637208, errs=0, drops=0 |
| outgoing : bytes=372.01M, pkts=3200026, errs=0, drops=0 |
| IPv4 address : 10.0.0.2 |
| broadcast : 10.255.255.255 |
| netmask : 255.0.0.0 |
| IPv6 address : fe80::ecb3:1584:5d17:937%wlp3s0 |
| netmask : ffff:ffff:ffff:ffff:: |
| MAC address : 48:45:20:59:a4:0c |
| broadcast : ff:ff:ff:ff:ff:ff |
| """ |
| |
| |
| import socket |
| |
| import psutil |
| from psutil._common import bytes2human |
| |
| af_map = { |
| socket.AF_INET: 'IPv4', |
| socket.AF_INET6: 'IPv6', |
| psutil.AF_LINK: 'MAC', |
| } |
| |
| duplex_map = { |
| psutil.NIC_DUPLEX_FULL: "full", |
| psutil.NIC_DUPLEX_HALF: "half", |
| psutil.NIC_DUPLEX_UNKNOWN: "?", |
| } |
| |
| |
| def main(): |
| stats = psutil.net_if_stats() |
| io_counters = psutil.net_io_counters(pernic=True) |
| for nic, addrs in psutil.net_if_addrs().items(): |
| print(f"{nic}:") |
| if nic in stats: |
| st = stats[nic] |
| print(" stats : ", end='') |
| print( |
| "speed={}MB, duplex={}, mtu={}, up={}".format( |
| st.speed, |
| duplex_map[st.duplex], |
| st.mtu, |
| "yes" if st.isup else "no", |
| ) |
| ) |
| if nic in io_counters: |
| io = io_counters[nic] |
| print(" incoming : ", end='') |
| print( |
| "bytes={}, pkts={}, errs={}, drops={}".format( |
| bytes2human(io.bytes_recv), |
| io.packets_recv, |
| io.errin, |
| io.dropin, |
| ) |
| ) |
| print(" outgoing : ", end='') |
| print( |
| "bytes={}, pkts={}, errs={}, drops={}".format( |
| bytes2human(io.bytes_sent), |
| io.packets_sent, |
| io.errout, |
| io.dropout, |
| ) |
| ) |
| for addr in addrs: |
| fam = " {:<4}".format(af_map.get(addr.family, addr.family)) |
| print(fam, end="") |
| print(f" address : {addr.address}") |
| if addr.broadcast: |
| print(f" broadcast : {addr.broadcast}") |
| if addr.netmask: |
| print(f" netmask : {addr.netmask}") |
| if addr.ptp: |
| print(f" p2p : {addr.ptp}") |
| print() |
| |
| |
| if __name__ == '__main__': |
| main() |