Inspect Linux network interfaces, Wi-Fi state, routes, DNS, and network events from Python.
Project description
ifpeek
Inspect Linux network interfaces, Wi-Fi state, routes, DNS, and network events from Python.
Linux only. ifpeek relies on
pyroute2(netlink), its single runtime dependency.
Installation
Requires Python 3.10+ on Linux. Install with uv:
uv add ifpeek # core (only dependency: pyroute2)
uv add "ifpeek[scan]" # + nearby Wi-Fi scanning (iwd / NetworkManager / wpa_supplicant)
Features
Core facts (interfaces, Wi-Fi, routes, events) come from the kernel via pyroute2 (netlink / nl80211):
no external tools, no root. DNS is read from resolv.conf, and the optional Wi-Fi scan uses D-Bus.
Interfaces
- List loopback / ethernet / wifi interfaces (classified by kernel type, not by name).
- Per interface: type, operational state, MAC, MTU, carrier, IPv4 / IPv6 addresses, traffic counters (bytes / packets / errors / drops), and throughput rate.
Access point (Wi-Fi)
- ESSID, BSSID, signal (dBm + %), plus the frequency and current bitrate of the associated AP.
Host network
- The default interface, default gateway (IPv4 / IPv6), and the configured DNS servers.
Nearby Wi-Fi scan (optional, requires ifpeek[scan] + a running Wi-Fi daemon)
- List nearby access points (SSID, signal, security) via iwd, NetworkManager, or wpa_supplicant over D-Bus, without root.
Events
watch(): a live stream of link / address / route changes (netlink, no root), to react instead of poll.
Usage
import ifpeek
# --- interfaces ---
ifpeek.get_wifi_interfaces() # ['wlan0']
ifpeek.interface_type("docker0") # 'bridge'
ifpeek.interface_operstate("wlan0") # 'UP'
ifpeek.interface_mac_address("wlan0") # 'a1:b2:c3:d4:e5:f6'
ifpeek.interface_mtu("wlan0") # 1500
ifpeek.interface_ipv4_addresses("wlan0") # ['192.168.1.42']
ifpeek.interface_stats("wlan0").rx_packets # 51702404
ifpeek.interface_rate("wlan0") # InterfaceRate(rx_bytes_per_sec=…, tx_bytes_per_sec=…)
# --- access point (Wi-Fi) ---
ifpeek.access_point_essid("wlan0") # 'MyNetwork'
ifpeek.access_point_mac_address("wlan0") # 'aa:bb:cc:dd:ee:ff' (BSSID)
ifpeek.access_point_signal_dbm("wlan0") # -47
ifpeek.access_point_frequency("wlan0") # 5280 (MHz)
ifpeek.access_point_bitrate("wlan0") # 866.7 (Mbps)
# --- host network ---
ifpeek.default_interface() # 'wlan0'
ifpeek.default_gateway_ipv4() # '192.168.1.1'
ifpeek.dns_servers() # ['192.168.1.1']
Nearby Wi-Fi scan (optional)
Requires the scan extra and a running Wi-Fi daemon: iwd,
NetworkManager, or wpa_supplicant,
auto-detected. The caller must be allowed on the daemon's D-Bus (e.g. be in the wheel / network group):
uv add "ifpeek[scan]"
import ifpeek
for ap in ifpeek.scan_access_points(): # strongest signal first
print(ap.ssid, ap.bssid, ap.signal_percent, ap.security)
# AccessPoint(ssid='MyNetwork', bssid='aa:bb:cc:dd:ee:ff', frequency=5180,
# signal_dbm=None, signal_percent=100, security='psk', connected=True)
signal_percent (0-100) is always present. signal_dbm is usually filled by iwd / wpa_supplicant
and None on NetworkManager (percentage-only); bssid and frequency are usually filled by
NetworkManager / wpa_supplicant and None on iwd (its scan is network-centric).
Backend status: the iwd backend is verified against a live daemon. The NetworkManager and wpa_supplicant backends are implemented against their documented D-Bus APIs and unit-tested, but not yet exercised against a live daemon. Bug reports welcome.
Watch for changes (event stream)
import ifpeek
for event in ifpeek.watch(): # blocks; yields as things change
print(event.kind, event.action, event.interface, event.detail)
# NetworkEvent(kind='link', action='new', interface='wlan0', index=4, detail={'operstate': 'DOWN'})
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ifpeek-1.0.0.tar.gz.
File metadata
- Download URL: ifpeek-1.0.0.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b296123733b0677ab0b2e207bc8bd17899fccd238edcbae3a2ec46bd2e1b8b7
|
|
| MD5 |
7a81799ea40046a21c3bd87debdcab6f
|
|
| BLAKE2b-256 |
2a7f4a35f131fdbdead86cd189cdced06b3e1b3e4f5418f0114c36e0eb253ee3
|
Provenance
The following attestation bundles were made for ifpeek-1.0.0.tar.gz:
Publisher:
publish.yml on carlosplanchon/ifpeek
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ifpeek-1.0.0.tar.gz -
Subject digest:
3b296123733b0677ab0b2e207bc8bd17899fccd238edcbae3a2ec46bd2e1b8b7 - Sigstore transparency entry: 2094229144
- Sigstore integration time:
-
Permalink:
carlosplanchon/ifpeek@b46c58565d057ebd60e44406ece4365c19c271b6 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/carlosplanchon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b46c58565d057ebd60e44406ece4365c19c271b6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ifpeek-1.0.0-py3-none-any.whl.
File metadata
- Download URL: ifpeek-1.0.0-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a5dd07e3ea119e7606c7f888aa7fe064cba9b359b898bedc68e0886aaa82839
|
|
| MD5 |
2affd279d29b75d845ffe59f0c291bc8
|
|
| BLAKE2b-256 |
0972d3bbbf3779d7eb784a298f2da8bc13b89ce51997f119a86c80972aa6ef1d
|
Provenance
The following attestation bundles were made for ifpeek-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on carlosplanchon/ifpeek
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ifpeek-1.0.0-py3-none-any.whl -
Subject digest:
7a5dd07e3ea119e7606c7f888aa7fe064cba9b359b898bedc68e0886aaa82839 - Sigstore transparency entry: 2094229416
- Sigstore integration time:
-
Permalink:
carlosplanchon/ifpeek@b46c58565d057ebd60e44406ece4365c19c271b6 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/carlosplanchon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b46c58565d057ebd60e44406ece4365c19c271b6 -
Trigger Event:
push
-
Statement type: