mirror of
https://github.com/jayofelony/pwnagotchi.git
synced 2025-07-01 18:37:27 -04:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
b03b3119c7 | |||
d259e862ba | |||
5844e51cf8 | |||
5ca0bebea7 | |||
5824a6d77c | |||
bee02ab0cb | |||
211b60dcf6 | |||
7ce497e56e | |||
baf31f4523 |
@ -4,10 +4,10 @@
|
||||
|
||||
It seems the Pi 5 is unable to run in monitor mode, will keep you updated on this.
|
||||
|
||||
If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.5.4) and make sure you download the `armhf` version.
|
||||
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.**
|
||||
|
||||
|
@ -1 +1 @@
|
||||
__version__ = '2.6.4'
|
||||
__version__ = '2.6.8'
|
||||
|
@ -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))
|
||||
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -10,7 +10,7 @@ import flask
|
||||
|
||||
# https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server
|
||||
logging.getLogger('werkzeug').setLevel(logging.ERROR)
|
||||
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
|
||||
os.environ['WERKZEUG_RUN_MAIN'] = 'false'
|
||||
|
||||
import pwnagotchi
|
||||
import pwnagotchi.grid as grid
|
||||
|
@ -5,7 +5,7 @@ import os
|
||||
|
||||
# https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server
|
||||
logging.getLogger('werkzeug').setLevel(logging.ERROR)
|
||||
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
|
||||
os.environ['WERKZEUG_RUN_MAIN'] = 'false'
|
||||
|
||||
from flask import Flask
|
||||
from flask_cors import CORS
|
||||
|
@ -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)
|
||||
|
@ -27,8 +27,8 @@ dependencies = [
|
||||
"spidev",
|
||||
"stable_baselines3",
|
||||
"toml",
|
||||
"torch==2.0.1",
|
||||
"torchvision==0.15.2",
|
||||
"torch",
|
||||
"torchvision",
|
||||
"tweepy",
|
||||
"websockets"
|
||||
]
|
||||
|
@ -1,7 +1,6 @@
|
||||
OPi.GPIO; platform_release=="6.1.31-sun50iw9"
|
||||
Pillow
|
||||
PyYAML
|
||||
RPi.GPIO; platform_release!="6.1.31-sun50iw9"
|
||||
RPi.GPIO
|
||||
file-read-backwards
|
||||
flask
|
||||
flask-cors
|
||||
@ -13,13 +12,12 @@ pycryptodome
|
||||
pydrive2
|
||||
python-dateutil
|
||||
requests
|
||||
rpi_hardware_pwm; platform_release!="6.1.31-sun50iw9"
|
||||
rpi_hardware_pwm
|
||||
scapy
|
||||
shimmy; platform_machine!="armv6l"
|
||||
shimmy
|
||||
smbus2
|
||||
spidev
|
||||
stable_baselines3; platform_machine!="armv6l"
|
||||
stable_baselines3==1.8.0; platform_machine=="armv6l"
|
||||
stable_baselines3
|
||||
toml
|
||||
torch
|
||||
torchvision
|
||||
|
Reference in New Issue
Block a user