mirror of
https://github.com/jayofelony/pwnagotchi.git
synced 2025-07-01 18:37:27 -04:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
18217119fc | |||
b03b3119c7 | |||
d259e862ba | |||
5844e51cf8 | |||
5ca0bebea7 |
@ -7,7 +7,7 @@ It seems the Pi 5 is unable to run in monitor mode, will keep you updated on thi
|
||||
If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.6.4) and make sure you download the `armhf` version.
|
||||
|
||||
---
|
||||
Download latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.6.2), and let it auto-update from here on out.
|
||||
Download latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.6.7), and let it auto-update from here on out.
|
||||
|
||||
**Use RPi imager to flash, please don't flash a new user as this will mess with logs created.**
|
||||
|
||||
|
@ -172,12 +172,12 @@ def pwnagotchi_cli():
|
||||
% (pwnagotchi.__version__, latest_ver))
|
||||
# input validation
|
||||
if user_input.lower() in ('y', 'yes'):
|
||||
os.system("rm /root/.auto-update && systemctl restart pwnagotchi")
|
||||
if os.path.exists('/root/.auto-update'):
|
||||
os.system("rm /root/.auto-update && systemctl restart pwnagotchi")
|
||||
os.system("systemctl restart pwnagotchi")
|
||||
print("Okay, give me a couple minutes. Just watch pwnlog while you wait.")
|
||||
elif user_input.lower() in ('n', 'no'): # using this elif for readability
|
||||
print("Okay, guess not!")
|
||||
else:
|
||||
print("You are currently on the latest release, v%s." % pwnagotchi.__version__)
|
||||
print("Okay, guess not!")
|
||||
print("You are currently on the latest release, v%s." % pwnagotchi.__version__)
|
||||
sys.exit(0)
|
||||
|
||||
config = utils.load_config(args)
|
||||
|
@ -1 +1 @@
|
||||
__version__ = '2.6.5'
|
||||
__version__ = '2.6.9'
|
||||
|
@ -11,10 +11,6 @@ from pwnagotchi import plugins
|
||||
import pwnagotchi.ui.faces as faces
|
||||
from pwnagotchi.bettercap import Client
|
||||
|
||||
from pwnagotchi.ui.components import Text
|
||||
from pwnagotchi.ui.view import BLACK
|
||||
import pwnagotchi.ui.fonts as fonts
|
||||
|
||||
|
||||
class FixServices(plugins.Plugin):
|
||||
__author__ = 'jayofelony'
|
||||
@ -41,14 +37,12 @@ class FixServices(plugins.Plugin):
|
||||
self.isReloadingMon = False
|
||||
self.connection = None
|
||||
self.LASTTRY = 0
|
||||
self._status = "--"
|
||||
self._count = 0
|
||||
|
||||
def on_loaded(self):
|
||||
"""
|
||||
Gets called when the plugin gets loaded
|
||||
"""
|
||||
self._status = "ld"
|
||||
logging.info("[Fix_Services] plugin loaded.")
|
||||
|
||||
def on_ready(self, agent):
|
||||
@ -59,10 +53,8 @@ class FixServices(plugins.Plugin):
|
||||
logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output))
|
||||
if ",UP," in str(cmd_output):
|
||||
logging.info("wlan0mon is up.")
|
||||
self._status = "up"
|
||||
|
||||
if len(self.pattern.findall(last_lines)) >= 3:
|
||||
self._status = "XX"
|
||||
if hasattr(agent, 'view'):
|
||||
display = agent.view()
|
||||
display.set('status', 'Blind-Bug detected. Restarting.')
|
||||
@ -75,12 +67,10 @@ class FixServices(plugins.Plugin):
|
||||
|
||||
else:
|
||||
logging.info("[Fix_Services] Logs look good!")
|
||||
self._status = ""
|
||||
|
||||
except Exception as err:
|
||||
logging.error("[Fix_Services ip link show wlan0mon]: %s" % repr(err))
|
||||
try:
|
||||
self._status = "xx"
|
||||
self._tryTurningItOffAndOnAgain(agent)
|
||||
except Exception as err:
|
||||
logging.error("[Fix_Services OffNOn]: %s" % repr(err))
|
||||
@ -115,7 +105,7 @@ class FixServices(plugins.Plugin):
|
||||
other_last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10'],
|
||||
stdout=subprocess.PIPE).stdout))[-10:])
|
||||
other_other_last_lines = ''.join(
|
||||
list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/var/log/pwnagotchi.log'],
|
||||
list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/home/pi/logs/pwnagotchi.log'],
|
||||
stdout=subprocess.PIPE).stdout))[-10:])
|
||||
# don't check if we ran a reset recently
|
||||
logging.debug("[Fix_Services]**** epoch")
|
||||
@ -153,7 +143,6 @@ class FixServices(plugins.Plugin):
|
||||
logging.info("[Fix_Services] wifi.recon flip: success!")
|
||||
if display:
|
||||
display.update(force=True, new_data={"status": "Wifi recon flipped!",
|
||||
"brcmfmac_status": self._status,
|
||||
"face": faces.COOL})
|
||||
else:
|
||||
print("Wifi recon flipped\nthat was easy!")
|
||||
@ -223,12 +212,11 @@ class FixServices(plugins.Plugin):
|
||||
self.isReloadingMon = True
|
||||
self.LASTTRY = time.time()
|
||||
|
||||
self._status = "BL"
|
||||
if hasattr(connection, 'view'):
|
||||
display = connection.view()
|
||||
if display:
|
||||
display.update(force=True, new_data={"status": "I'm blind! Try turning it off and on again",
|
||||
"brcmfmac_status": self._status, "face": faces.BORED})
|
||||
"face": faces.BORED})
|
||||
else:
|
||||
display = None
|
||||
|
||||
@ -271,7 +259,6 @@ class FixServices(plugins.Plugin):
|
||||
|
||||
try:
|
||||
cmd_output = subprocess.check_output("monstop", shell=True)
|
||||
self._status = "dn"
|
||||
self.logPrintView("info", "[Fix_Services] wlan0mon down and deleted: %s" % cmd_output,
|
||||
display, {"status": "wlan0mon d-d-d-down!", "face": faces.BORED})
|
||||
except Exception as nope:
|
||||
@ -291,7 +278,6 @@ class FixServices(plugins.Plugin):
|
||||
cmd_output = subprocess.check_output("sudo modprobe -r brcmfmac", shell=True)
|
||||
self.logPrintView("info", "[Fix_Services] unloaded brcmfmac", display,
|
||||
{"status": "Turning it off #%s" % tries, "face": faces.SMART})
|
||||
self._status = "ul"
|
||||
time.sleep(1 + tries)
|
||||
|
||||
# reload the module
|
||||
@ -300,7 +286,6 @@ class FixServices(plugins.Plugin):
|
||||
cmd_output = subprocess.check_output("sudo modprobe brcmfmac", shell=True)
|
||||
|
||||
self.logPrintView("info", "[Fix_Services] reloaded brcmfmac")
|
||||
self._status = "rl"
|
||||
time.sleep(10 + 4 * tries) # give it some time for wlan device to stabilize, or whatever
|
||||
|
||||
# success! now make the mon0
|
||||
@ -308,14 +293,12 @@ class FixServices(plugins.Plugin):
|
||||
cmd_output = subprocess.check_output("monstart", shell=True)
|
||||
self.logPrintView("info", "[Fix_Services interface add wlan0mon] worked #%s: %s"
|
||||
% (tries, cmd_output))
|
||||
self._status = "up"
|
||||
time.sleep(tries + 5)
|
||||
try:
|
||||
# try accessing mon0 in bettercap
|
||||
result = connection.run("set wifi.interface wlan0mon")
|
||||
if "success" in result:
|
||||
logging.info("[Fix_Services set wifi.interface wlan0mon] worked!")
|
||||
self._status = ""
|
||||
self._count = self._count + 1
|
||||
time.sleep(1)
|
||||
# stop looping and get back to recon
|
||||
@ -354,7 +337,6 @@ class FixServices(plugins.Plugin):
|
||||
if tries < 3:
|
||||
if display:
|
||||
display.update(force=True, new_data={"status": "And back on again...",
|
||||
"brcmfmac_status": self._status,
|
||||
"face": faces.INTENSE})
|
||||
else:
|
||||
print("And back on again...")
|
||||
@ -370,10 +352,8 @@ class FixServices(plugins.Plugin):
|
||||
result = connection.run("wifi.clear; wifi.recon on")
|
||||
|
||||
if "success" in result: # and result["success"] is True:
|
||||
self._status = ""
|
||||
if display:
|
||||
display.update(force=True, new_data={"status": "I can see again! (probably)",
|
||||
"brcmfmac_status": self._status,
|
||||
"face": faces.HAPPY})
|
||||
else:
|
||||
print("I can see again")
|
||||
@ -388,31 +368,9 @@ class FixServices(plugins.Plugin):
|
||||
logging.error("[Fix_Services wifi.recon on] %s" % repr(err))
|
||||
pwnagotchi.reboot()
|
||||
|
||||
# called to setup the ui elements
|
||||
def on_ui_setup(self, ui):
|
||||
with ui._lock:
|
||||
# add custom UI elements
|
||||
if "position" in self.options:
|
||||
pos = self.options['position'].split(',')
|
||||
pos = [int(x.strip()) for x in pos]
|
||||
else:
|
||||
pos = (ui.width() / 2 + 35, ui.height() - 11)
|
||||
|
||||
logging.info("Got here")
|
||||
ui.add_element('brcmfmac_status', Text(color=BLACK, value='--', position=pos, font=fonts.Small))
|
||||
|
||||
# called when the ui is updated
|
||||
def on_ui_update(self, ui):
|
||||
# update those elements
|
||||
if self._status:
|
||||
ui.set('brcmfmac_status', "wlan0mon %s" % self._status)
|
||||
else:
|
||||
ui.set('brcmfmac_status', "rst#%s" % self._count)
|
||||
|
||||
def on_unload(self, ui):
|
||||
with ui._lock:
|
||||
try:
|
||||
ui.remove_element('brcmfmac_status')
|
||||
logging.info("[Fix_Services] unloaded")
|
||||
except Exception as err:
|
||||
logging.info("[Fix_Services] unload err %s " % repr(err))
|
||||
|
@ -141,7 +141,7 @@ class MemTemp(plugins.Plugin):
|
||||
elif ui.is_inky():
|
||||
h_pos = (140, 68)
|
||||
v_pos = (160, 54)
|
||||
elif ui.is_waveshare27inch():
|
||||
elif ui.is_waveshare2in7():
|
||||
h_pos = (192, 138)
|
||||
v_pos = (211, 122)
|
||||
else:
|
||||
|
@ -235,7 +235,7 @@ if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'):
|
||||
elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'):
|
||||
implementation = SunriseX3()
|
||||
else:
|
||||
implementation = JetsonNano()
|
||||
implementation = RaspberryPi()
|
||||
|
||||
for func in [x for x in dir(implementation) if not x.startswith('_')]:
|
||||
setattr(sys.modules[__name__], func, getattr(implementation, func))
|
||||
|
@ -240,7 +240,6 @@ def load_config(args):
|
||||
# the very first step is to normalize the display name, so we don't need dozens of if/elif around
|
||||
if config['ui']['display']['type'] in ('inky', 'inkyphat'):
|
||||
config['ui']['display']['type'] = 'inky'
|
||||
|
||||
elif config['ui']['display']['type'] in ('papirus', 'papi'):
|
||||
config['ui']['display']['type'] = 'papirus'
|
||||
|
||||
@ -259,14 +258,26 @@ def load_config(args):
|
||||
elif config['ui']['display']['type'] in ('ws_4', 'ws4', 'waveshare_4', 'waveshare4'):
|
||||
config['ui']['display']['type'] = 'waveshare_4'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_27inch', 'ws27inch', 'waveshare_27inch', 'waveshare27inch'):
|
||||
elif config['ui']['display']['type'] in ('ws_27inch', 'ws27inch', 'waveshare2in7', 'waveshare_27inch', 'waveshare27inch'):
|
||||
config['ui']['display']['type'] = 'waveshare27inch'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_27inchv2', 'ws27inchv2', 'waveshare_27inchv2', 'waveshare27inchv2'):
|
||||
config['ui']['display']['type'] = 'waveshare27inchv2'
|
||||
elif config['ui']['display']['type'] in ('ws_27inchv2', 'waveshare2in7_v2', 'ws27inchv2', 'waveshare_27inchv2', 'waveshare27inchv2'):
|
||||
config['ui']['display']['type'] = 'waveshare2in7_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_29inch', 'ws29inch', 'waveshare_29inch', 'waveshare29inch'):
|
||||
config['ui']['display']['type'] = 'waveshare29inch'
|
||||
elif config['ui']['display']['type'] in ('ws_27inchbv2', 'waveshare2in7b_v2', 'ws27inchbv2', 'waveshare_27inchbv2', 'waveshare27inchbv2'):
|
||||
config['ui']['display']['type'] = 'waveshare2in7b_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_29inch', 'waveshare2in9', 'ws29inch', 'waveshare_29inch', 'waveshare29inch'):
|
||||
config['ui']['display']['type'] = 'waveshare2in9'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_29inchv2', 'waveshare2in9_v2', 'ws29inchv2', 'waveshare_29inchv2', 'waveshare29inchv2'):
|
||||
config['ui']['display']['type'] = 'waveshare2in9_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_29inchbv3', 'waveshare2in9b_v3', 'ws29inchbv3', 'waveshare_29inchbv3', 'waveshare29inchbv3'):
|
||||
config['ui']['display']['type'] = 'waveshare2in9b_v3'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_29inchbv4', 'waveshare2in9b_v4', 'ws29inchbv4', 'waveshare_29inchbv4', 'waveshare29inchbv4'):
|
||||
config['ui']['display']['type'] = 'waveshare2in9b_v4'
|
||||
|
||||
elif config['ui']['display']['type'] in 'lcdhat':
|
||||
config['ui']['display']['type'] = 'lcdhat'
|
||||
@ -277,21 +288,29 @@ def load_config(args):
|
||||
elif config['ui']['display']['type'] in ('dfrobot_2', 'df2'):
|
||||
config['ui']['display']['type'] = 'dfrobot_2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_154inch', 'ws154inch', 'waveshare_154inch', 'waveshare154inch'):
|
||||
config['ui']['display']['type'] = 'waveshare154inch'
|
||||
elif config['ui']['display']['type'] in ('ws_154inch', 'waveshare1in54', 'ws154inch', 'waveshare_154inch', 'waveshare154inch'):
|
||||
config['ui']['display']['type'] = 'waveshare1in54'
|
||||
|
||||
elif config['ui']['display']['type'] in (
|
||||
'waveshare144lcd', 'ws_144inch', 'ws144inch', 'waveshare_144inch', 'waveshare144inch'):
|
||||
elif config['ui']['display']['type'] in ('ws_154inchb', 'waveshare1in54b', 'ws154inchb', 'waveshare_154inchb', 'waveshare154inchb'):
|
||||
config['ui']['display']['type'] = 'waveshare1in54b'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_154inchbv2', 'waveshare1in54bv2', 'ws154inchbv2', 'waveshare_154inchbv2', 'waveshare154inchbv2'):
|
||||
config['ui']['display']['type'] = 'waveshare1in54b_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_154inchv2', 'waveshare1in54v2', 'ws154inchv2', 'waveshare_154inchv2', 'waveshare154inchv2'):
|
||||
config['ui']['display']['type'] = 'waveshare1in54_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in ('waveshare144lcd', 'ws_144inch', 'ws144inch', 'waveshare_144inch', 'waveshare144inch'):
|
||||
config['ui']['display']['type'] = 'waveshare144lcd'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_213d', 'ws213d', 'waveshare_213d', 'waveshare213d'):
|
||||
config['ui']['display']['type'] = 'waveshare213d'
|
||||
elif config['ui']['display']['type'] in ('ws_213d', 'ws213d', 'waveshare2in13d', 'waveshare_213d', 'waveshare213d'):
|
||||
config['ui']['display']['type'] = 'waveshare2in13d'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_213bc', 'ws213bc', 'waveshare_213bc', 'waveshare213bc'):
|
||||
config['ui']['display']['type'] = 'waveshare213bc'
|
||||
elif config['ui']['display']['type'] in ('ws_213bc', 'ws213bc', 'waveshare2in13bc', 'waveshare_213bc', 'waveshare213bc'):
|
||||
config['ui']['display']['type'] = 'waveshare2in13bc'
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_213bv4', 'ws213bv4', 'waveshare_213bv4', 'waveshare213inb_v4'):
|
||||
config['ui']['display']['type'] = 'waveshare213inb_v4'
|
||||
elif config['ui']['display']['type'] in ('ws_213bv4', 'waveshare2in13b_v4', 'ws213bv4', 'waveshare_213bv4', 'waveshare213inb_v4'):
|
||||
config['ui']['display']['type'] = 'waveshare2in13b_v4'
|
||||
|
||||
elif config['ui']['display']['type'] in 'spotpear24inch':
|
||||
config['ui']['display']['type'] = 'spotpear24inch'
|
||||
@ -302,6 +321,105 @@ def load_config(args):
|
||||
elif config['ui']['display']['type'] in 'waveshare35lcd':
|
||||
config['ui']['display']['type'] = 'waveshare35lcd'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare1in54c':
|
||||
config['ui']['display']['type'] = 'waveshare1in54c'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare1in64g':
|
||||
config['ui']['display']['type'] = 'waveshare1in64g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare1in02':
|
||||
config['ui']['display']['type'] = 'waveshare1in02'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in9bc':
|
||||
config['ui']['display']['type'] = 'waveshare2in9bc'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in9d':
|
||||
config['ui']['display']['type'] = 'waveshare2in9d'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in13b_v3':
|
||||
config['ui']['display']['type'] = 'waveshare2in13b_v3'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in23g':
|
||||
config['ui']['display']['type'] = 'waveshare2in23g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in36g':
|
||||
config['ui']['display']['type'] = 'waveshare2in36g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare2in66':
|
||||
config['ui']['display']['type'] = 'waveshare2in66'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare3in0g':
|
||||
config['ui']['display']['type'] = 'waveshare3in0g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare3in7':
|
||||
config['ui']['display']['type'] = 'waveshare3in7'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare3in52':
|
||||
config['ui']['display']['type'] = 'waveshare3in52'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in01f':
|
||||
config['ui']['display']['type'] = 'waveshare4in01f'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in2':
|
||||
config['ui']['display']['type'] = 'waveshare4in2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in2_v2':
|
||||
config['ui']['display']['type'] = 'waveshare4in2_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in2b_v2':
|
||||
config['ui']['display']['type'] = 'waveshare4in2b_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in2bc':
|
||||
config['ui']['display']['type'] = 'waveshare4in2bc'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in26':
|
||||
config['ui']['display']['type'] = 'waveshare4in26'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare4in37g':
|
||||
config['ui']['display']['type'] = 'waveshare4in37g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare5in65f':
|
||||
config['ui']['display']['type'] = 'waveshare5in65f'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare5in83':
|
||||
config['ui']['display']['type'] = 'waveshare5in83'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare5in83_v2':
|
||||
config['ui']['display']['type'] = 'waveshare5in83_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare5in83b_v2':
|
||||
config['ui']['display']['type'] = 'waveshare5in83b_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare5in83bc':
|
||||
config['ui']['display']['type'] = 'waveshare5in83bc'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in3f':
|
||||
config['ui']['display']['type'] = 'waveshare7in3f'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in3g':
|
||||
config['ui']['display']['type'] = 'waveshare7in3g'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5':
|
||||
config['ui']['display']['type'] = 'waveshare7in5'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5_HD':
|
||||
config['ui']['display']['type'] = 'waveshare7in5_HD'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5_v2':
|
||||
config['ui']['display']['type'] = 'waveshare7in5_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5b_HD':
|
||||
config['ui']['display']['type'] = 'waveshare7in5b_HD'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5b_v2':
|
||||
config['ui']['display']['type'] = 'waveshare7in5b_v2'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare7in5bc':
|
||||
config['ui']['display']['type'] = 'waveshare7in5bc'
|
||||
|
||||
elif config['ui']['display']['type'] in 'waveshare13in3k':
|
||||
config['ui']['display']['type'] = 'waveshare13in3k'
|
||||
|
||||
else:
|
||||
print("unsupported display type %s" % config['ui']['display']['type'])
|
||||
sys.exit(1)
|
||||
@ -326,7 +444,10 @@ def iface_channels(ifname):
|
||||
output = subprocess.getoutput("/sbin/iw phy%s channels | grep ' MHz' | grep -v disabled | sed 's/^.*\[//g' | sed s/\].*\$//g" % phy)
|
||||
for line in output.split("\n"):
|
||||
line = line.strip()
|
||||
channels.append(int(line))
|
||||
try:
|
||||
channels.append(int(line))
|
||||
except Exception as e:
|
||||
pass
|
||||
return channels
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user