mirror of
https://github.com/jayofelony/pwnagotchi.git
synced 2025-07-01 18:37:27 -04:00
155 lines
4.8 KiB
Python
155 lines
4.8 KiB
Python
import logging
|
|
|
|
import pwnagotchi.plugins as plugins
|
|
from pwnagotchi.ui.components import LabeledValue
|
|
from pwnagotchi.ui.view import BLACK
|
|
import pwnagotchi.ui.fonts as fonts
|
|
|
|
|
|
class Example(plugins.Plugin):
|
|
__author__ = 'evilsocket@gmail.com'
|
|
__version__ = '1.0.0'
|
|
__license__ = 'GPL3'
|
|
__description__ = 'An example plugin for pwnagotchi that implements all the available callbacks.'
|
|
|
|
def __init__(self):
|
|
logging.debug("example plugin created")
|
|
|
|
# called when the plugin is loaded
|
|
def on_loaded(self):
|
|
logging.warning("WARNING: this plugin should be disabled! options = " % self.options)
|
|
|
|
# called when <host>:<port>/plugins/<pluginname> is opened
|
|
def on_webhook(self, response, path):
|
|
res = "<html><body><a>Hook triggered</a></body></html>"
|
|
response.send_response(200)
|
|
response.send_header('Content-type', 'text/html')
|
|
response.end_headers()
|
|
|
|
try:
|
|
response.wfile.write(bytes(res, "utf-8"))
|
|
except Exception as ex:
|
|
logging.error(ex)
|
|
|
|
# called in manual mode when there's internet connectivity
|
|
def on_internet_available(self, agent):
|
|
pass
|
|
|
|
# called to setup the ui elements
|
|
def on_ui_setup(self, ui):
|
|
# add custom UI elements
|
|
ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),
|
|
label_font=fonts.Bold, text_font=fonts.Medium))
|
|
|
|
# called when the ui is updated
|
|
def on_ui_update(self, ui):
|
|
# update those elements
|
|
some_voltage = 0.1
|
|
some_capacity = 100.0
|
|
ui.set('ups', "%4.2fV/%2i%%" % (some_voltage, some_capacity))
|
|
|
|
# called when the hardware display setup is done, display is an hardware specific object
|
|
def on_display_setup(self, display):
|
|
pass
|
|
|
|
# called when everything is ready and the main loop is about to start
|
|
def on_ready(self, agent):
|
|
logging.info("unit is ready")
|
|
# you can run custom bettercap commands if you want
|
|
# agent.run('ble.recon on')
|
|
# or set a custom state
|
|
# agent.set_bored()
|
|
|
|
# called when the AI finished loading
|
|
def on_ai_ready(self, agent):
|
|
pass
|
|
|
|
# called when the AI finds a new set of parameters
|
|
def on_ai_policy(self, agent, policy):
|
|
pass
|
|
|
|
# called when the AI starts training for a given number of epochs
|
|
def on_ai_training_start(self, agent, epochs):
|
|
pass
|
|
|
|
# called after the AI completed a training epoch
|
|
def on_ai_training_step(self, agent, _locals, _globals):
|
|
pass
|
|
|
|
# called when the AI has done training
|
|
def on_ai_training_end(self, agent):
|
|
pass
|
|
|
|
# called when the AI got the best reward so far
|
|
def on_ai_best_reward(self, agent, reward):
|
|
pass
|
|
|
|
# called when the AI got the worst reward so far
|
|
def on_ai_worst_reward(self, agent, reward):
|
|
pass
|
|
|
|
# called when a non overlapping wifi channel is found to be free
|
|
def on_free_channel(self, agent, channel):
|
|
pass
|
|
|
|
# called when the status is set to bored
|
|
def on_bored(self, agent):
|
|
pass
|
|
|
|
# called when the status is set to sad
|
|
def on_sad(self, agent):
|
|
pass
|
|
|
|
# called when the status is set to excited
|
|
def on_excited(aself, gent):
|
|
pass
|
|
|
|
# called when the status is set to lonely
|
|
def on_lonely(self, agent):
|
|
pass
|
|
|
|
# called when the agent is rebooting the board
|
|
def on_rebooting(self, agent):
|
|
pass
|
|
|
|
# called when the agent is waiting for t seconds
|
|
def on_wait(self, agent, t):
|
|
pass
|
|
|
|
# called when the agent is sleeping for t seconds
|
|
def on_sleep(self, agent, t):
|
|
pass
|
|
|
|
# called when the agent refreshed its access points list
|
|
def on_wifi_update(self, agent, access_points):
|
|
pass
|
|
|
|
# called when the agent is sending an association frame
|
|
def on_association(self, agent, access_point):
|
|
pass
|
|
|
|
# called when the agent is deauthenticating a client station from an AP
|
|
def on_deauthentication(self, agent, access_point, client_station):
|
|
pass
|
|
|
|
# callend when the agent is tuning on a specific channel
|
|
def on_channel_hop(self, agent, channel):
|
|
pass
|
|
|
|
# called when a new handshake is captured, access_point and client_station are json objects
|
|
# if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs
|
|
def on_handshake(self, agent, filename, access_point, client_station):
|
|
pass
|
|
|
|
# called when an epoch is over (where an epoch is a single loop of the main algorithm)
|
|
def on_epoch(self, agent, epoch, epoch_data):
|
|
pass
|
|
|
|
# called when a new peer is detected
|
|
def on_peer_detected(self, agent, peer):
|
|
pass
|
|
|
|
# called when a known peer is lost
|
|
def on_peer_lost(self, agent, peer):
|
|
pass
|