1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| # !/usr/bin/env python3
import array
import socket
import struct
from fcntl import ioctl
IFNAMESIZE = 20
ESSODMAXSIZE = 32
SIOCGIWESSID = 0x8B1B
NET_PATH = "/sys/class/net"
class Point(object):
""" Class to hold iw_point data. """
def __init__(self, data=None, flags=0):
if data is None:
raise ValueError("data must be passed to Iwpoint")
# P pointer to data, H length, H flags
self.fmt = 'PHH'
self.flags = flags
self.buff = array.array('b', data.encode())
self.caddr_t, self.length = self.buff.buffer_info()
self.packed_data = struct.pack(self.fmt, self.caddr_t,
self.length, self.flags)
def update(self, packed_data):
""" Updates the object attributes. """
self.packed_data = packed_data
self.caddr_t, self.length, self.flags = struct.unpack(self.fmt,
self.packed_data)
def _fcntl(request, args):
sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return ioctl(sockfd.fileno(), request, args)
def iw_get_ext(ifname, request, data=None):
""" Read information from ifname. """
buff = IFNAMESIZE - len(ifname)
ifreq = array.array('b', ifname.encode() + ('\0' * buff).encode())
# put some additional data behind the interface name
if data is not None:
ifreq.frombytes(data)
else:
# extend to 32 bytes for ioctl payload
ifreq.extend('\0' * 16)
result = _fcntl(request, ifreq)
return result, ifreq[IFNAMESIZE:]
def get_essid(ifname) -> str:
point = Point('\x00' * ESSODMAXSIZE)
iw_get_ext(ifname, SIOCGIWESSID, point.packed_data)
raw_essid = point.buff.tobytes()
return raw_essid.strip('\x00'.encode()).decode()
if __name__ == '__main__':
print(get_essid("wlo1"))
|