Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F38742536
show_wireless.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
show_wireless.py
View Options
#!/usr/bin/env python3
#
# Copyright (C) 2019 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import
argparse
import
re
from
sys
import
exit
from
copy
import
deepcopy
from
vyos.config
import
Config
from
vyos.util
import
popen
parser
=
argparse
.
ArgumentParser
()
parser
.
add_argument
(
"-s"
,
"--scan"
,
help
=
"Scan for Wireless APs on given interface, e.g. 'wlan0'"
)
parser
.
add_argument
(
"-b"
,
"--brief"
,
action
=
"store_true"
,
help
=
"Show wireless configuration"
)
parser
.
add_argument
(
"-c"
,
"--stations"
,
help
=
"Show wireless clients connected on interface, e.g. 'wlan0'"
)
def
show_brief
():
config
=
Config
()
if
len
(
config
.
list_effective_nodes
(
'interfaces wireless'
))
==
0
:
print
(
"No Wireless interfaces configured"
)
exit
(
0
)
interfaces
=
[]
for
intf
in
config
.
list_effective_nodes
(
'interfaces wireless'
):
config
.
set_level
(
f
'interfaces wireless {intf}'
)
data
=
{
'name'
:
intf
}
data
[
'type'
]
=
config
.
return_effective_value
(
'type'
)
or
'-'
data
[
'ssid'
]
=
config
.
return_effective_value
(
'ssid'
)
or
'-'
data
[
'channel'
]
=
config
.
return_effective_value
(
'channel'
)
or
'-'
interfaces
.
append
(
data
)
return
interfaces
def
ssid_scan
(
intf
):
# XXX: This ignores errors
tmp
,
_
=
popen
(
f
'/sbin/iw dev {intf} scan ap-force'
)
networks
=
[]
data
=
{
'ssid'
:
''
,
'mac'
:
''
,
'channel'
:
''
,
'signal'
:
''
}
re_mac
=
re
.
compile
(
r'([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})'
)
for
line
in
tmp
.
splitlines
():
if
line
.
startswith
(
'BSS '
):
ssid
=
deepcopy
(
data
)
ssid
[
'mac'
]
=
re
.
search
(
re_mac
,
line
)
.
group
()
elif
line
.
lstrip
()
.
startswith
(
'SSID: '
):
# SSID can be " SSID: WLAN-57 6405", thus strip all leading whitespaces
ssid
[
'ssid'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
elif
line
.
lstrip
()
.
startswith
(
'signal: '
):
# Siganl can be " signal: -67.00 dBm", thus strip all leading whitespaces
ssid
[
'signal'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
split
()[
0
]
elif
line
.
lstrip
()
.
startswith
(
'DS Parameter set: channel'
):
# Channel can be " DS Parameter set: channel 6" , thus
# strip all leading whitespaces
ssid
[
'channel'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
split
()[
-
1
]
networks
.
append
(
ssid
)
continue
return
networks
def
show_clients
(
intf
):
# XXX: This ignores errors
tmp
,
_
=
popen
(
f
'/sbin/iw dev {intf} station dump'
)
clients
=
[]
data
=
{
'mac'
:
''
,
'signal'
:
''
,
'rx_bytes'
:
''
,
'rx_packets'
:
''
,
'tx_bytes'
:
''
,
'tx_packets'
:
''
}
re_mac
=
re
.
compile
(
r'([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})'
)
for
line
in
tmp
.
splitlines
():
if
line
.
startswith
(
'Station'
):
client
=
deepcopy
(
data
)
client
[
'mac'
]
=
re
.
search
(
re_mac
,
line
)
.
group
()
elif
line
.
lstrip
()
.
startswith
(
'signal avg:'
):
client
[
'signal'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
.
split
()[
0
]
elif
line
.
lstrip
()
.
startswith
(
'rx bytes:'
):
client
[
'rx_bytes'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
elif
line
.
lstrip
()
.
startswith
(
'rx packets:'
):
client
[
'rx_packets'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
elif
line
.
lstrip
()
.
startswith
(
'tx bytes:'
):
client
[
'tx_bytes'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
elif
line
.
lstrip
()
.
startswith
(
'tx packets:'
):
client
[
'tx_packets'
]
=
line
.
lstrip
()
.
split
(
':'
)[
-
1
]
.
lstrip
()
clients
.
append
(
client
)
continue
return
clients
if
__name__
==
'__main__'
:
args
=
parser
.
parse_args
()
if
args
.
scan
:
print
(
"Address SSID Channel Signal (dbm)"
)
for
network
in
ssid_scan
(
args
.
scan
):
print
(
"{:<17} {:<32} {:>3} {}"
.
format
(
network
[
'mac'
],
network
[
'ssid'
],
network
[
'channel'
],
network
[
'signal'
]))
exit
(
0
)
elif
args
.
brief
:
print
(
"Interface Type SSID Channel"
)
for
intf
in
show_brief
():
print
(
"{:<9} {:<12} {:<32} {:>3}"
.
format
(
intf
[
'name'
],
intf
[
'type'
],
intf
[
'ssid'
],
intf
[
'channel'
]))
exit
(
0
)
elif
args
.
stations
:
print
(
"Station Signal RX: bytes packets TX: bytes packets"
)
for
client
in
show_clients
(
args
.
stations
):
print
(
"{:<17} {:>3} {:>15} {:>9} {:>15} {:>10} "
.
format
(
client
[
'mac'
],
client
[
'signal'
],
client
[
'rx_bytes'
],
client
[
'rx_packets'
],
client
[
'tx_bytes'
],
client
[
'tx_packets'
]))
exit
(
0
)
else
:
parser
.
print_help
()
exit
(
1
)
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Mon, Dec 15, 9:10 PM (3 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3083291
Default Alt Text
show_wireless.py (5 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment