new: grid plugin can now do messaging

This commit is contained in:
Simone Margaritelli 2019-10-11 23:29:34 +02:00
parent 7520d4dd6f
commit dfaf3418af
5 changed files with 54 additions and 5 deletions
builder
pwnagotchi

@ -34,7 +34,7 @@
url: "https://github.com/bettercap/bettercap/releases/download/v2.25/bettercap_linux_armv6l_2.25.zip" url: "https://github.com/bettercap/bettercap/releases/download/v2.25/bettercap_linux_armv6l_2.25.zip"
ui: "https://github.com/bettercap/ui/releases/download/v1.3.0/ui.zip" ui: "https://github.com/bettercap/ui/releases/download/v1.3.0/ui.zip"
pwngrid: pwngrid:
url: "https://github.com/evilsocket/pwngrid/releases/download/v1.5.7/pwngrid_linux_armv6l_v1.5.7.zip" url: "https://github.com/evilsocket/pwngrid/releases/download/v1.6.0/pwngrid_linux_armv6l_v1.6.0.zip"
apt: apt:
hold: hold:
- firmware-atheros - firmware-atheros

@ -12,11 +12,17 @@ import json
import subprocess import subprocess
import pwnagotchi import pwnagotchi
import pwnagotchi.utils as utils import pwnagotchi.utils as utils
from pwnagotchi.ui.components import LabeledValue
from pwnagotchi.ui.view import BLACK
import pwnagotchi.ui.fonts as fonts
from pwnagotchi.utils import WifiInfo, extract_from_pcap from pwnagotchi.utils import WifiInfo, extract_from_pcap
OPTIONS = dict() OPTIONS = dict()
REPORT = utils.StatusFile('/root/.api-report.json', data_format='json') REPORT = utils.StatusFile('/root/.api-report.json', data_format='json')
UNREAD_MESSAGES = 0
TOTAL_MESSAGES = 0
def on_loaded(): def on_loaded():
logging.info("grid plugin loaded.") logging.info("grid plugin loaded.")
@ -59,12 +65,17 @@ def is_excluded(what):
return False return False
def grid_call(path, obj): def grid_call(path, obj=None):
# pwngrid-peer is running on port 8666 # pwngrid-peer is running on port 8666
api_address = 'http://127.0.0.1:8666/api/v1%s' % path api_address = 'http://127.0.0.1:8666/api/v1%s' % path
r = requests.post(api_address, headers=None, json=obj) if obj is None:
r = requests.get(api_address, headers=None)
else:
r = requests.post(api_address, headers=None, json=obj)
if r.status_code != 200: if r.status_code != 200:
raise Exception("(status %d) %s" % (r.status_code, r.text)) raise Exception("(status %d) %s" % (r.status_code, r.text))
return r.json()
def grid_update_data(last_session): def grid_update_data(last_session):
@ -93,7 +104,7 @@ def grid_update_data(last_session):
'version': pwnagotchi.version 'version': pwnagotchi.version
} }
logging.debug("updating grid data:\n%s" % data) logging.debug("updating grid data: %s" % data)
grid_call("/data", data) grid_call("/data", data)
@ -111,8 +122,24 @@ def grid_report_ap(essid, bssid):
return False return False
def grid_inbox():
return grid_call("/inbox")["messages"]
def on_ui_update(ui):
new_value = ' %d (%d)' % (UNREAD_MESSAGES, TOTAL_MESSAGES)
if not ui.has_element('mailbox'):
logging.debug("add mailbox")
ui.add_element('mailbox',
LabeledValue(color=BLACK, label='MSG', value=new_value,
position=(100, 0),
label_font=fonts.Bold,
text_font=fonts.Medium))
ui.set('mailbox', new_value)
def on_internet_available(agent): def on_internet_available(agent):
global REPORT global REPORT, UNREAD_MESSAGES, TOTAL_MESSAGES
logging.debug("internet available") logging.debug("internet available")
@ -123,6 +150,14 @@ def on_internet_available(agent):
return return
try: try:
logging.debug("checking mailbox ...")
messages = grid_inbox()
TOTAL_MESSAGES = len(messages)
UNREAD_MESSAGES = len([m for m in messages if m['seen_at'] is None])
logging.debug( " %d unread messages of %d total" % (UNREAD_MESSAGES, TOTAL_MESSAGES))
logging.debug("checking pcaps") logging.debug("checking pcaps")
pcap_files = glob.glob(os.path.join(agent.config()['bettercap']['handshakes'], "*.pcap")) pcap_files = glob.glob(os.path.join(agent.config()['bettercap']['handshakes'], "*.pcap"))

@ -4,6 +4,7 @@ PATH = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono'
Bold = ImageFont.truetype("%s-Bold.ttf" % PATH, 10) Bold = ImageFont.truetype("%s-Bold.ttf" % PATH, 10)
BoldSmall = ImageFont.truetype("%s-Bold.ttf" % PATH, 8) BoldSmall = ImageFont.truetype("%s-Bold.ttf" % PATH, 8)
BoldBig = ImageFont.truetype("%s-Bold.ttf" % PATH, 25)
Medium = ImageFont.truetype("%s.ttf" % PATH, 10) Medium = ImageFont.truetype("%s.ttf" % PATH, 10)
Huge = ImageFont.truetype("%s-Bold.ttf" % PATH, 25) Huge = ImageFont.truetype("%s-Bold.ttf" % PATH, 25)

@ -12,6 +12,13 @@ class State(object):
self._state[key] = elem self._state[key] = elem
self._changes[key] = True self._changes[key] = True
def has_element(self, key):
return key in self._state
def remove_element(self, key):
del self._state[key]
self._changes[key] = True
def add_listener(self, key, cb): def add_listener(self, key, cb):
with self._lock: with self._lock:
self._listeners[key] = cb self._listeners[key] = cb

@ -124,9 +124,15 @@ class View(object):
ROOT = self ROOT = self
def has_element(self, key):
self._state.has_element(key)
def add_element(self, key, elem): def add_element(self, key, elem):
self._state.add_element(key, elem) self._state.add_element(key, elem)
def remove_element(self, key):
self._state.remove_element(key)
def width(self): def width(self):
return self._width return self._width