From 3ad426916f203c5b96afa08a1ba627cad38d2d33 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Wed, 23 Oct 2019 15:20:16 +0200 Subject: [PATCH] small refactoring to facilitate integration of the bond equation --- pwnagotchi/defaults.yml | 1 + pwnagotchi/mesh/peer.py | 50 ++++++++++++++++++++++++++-------------- pwnagotchi/mesh/utils.py | 16 +++++++++---- scripts/backup.sh | 1 + 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/pwnagotchi/defaults.yml b/pwnagotchi/defaults.yml index 6bd9435..6e91965 100644 --- a/pwnagotchi/defaults.yml +++ b/pwnagotchi/defaults.yml @@ -31,6 +31,7 @@ main: - /root/brain.json - /root/.api-report.json - /root/handshakes/ + - /root/peers/ - /etc/pwnagotchi/ - /var/log/pwnagotchi.log commands: diff --git a/pwnagotchi/mesh/peer.py b/pwnagotchi/mesh/peer.py index 14f0057..a3ddd55 100644 --- a/pwnagotchi/mesh/peer.py +++ b/pwnagotchi/mesh/peer.py @@ -1,17 +1,27 @@ import time import logging +import datetime import pwnagotchi.ui.faces as faces +def parse_rfc3339(dt): + return datetime.datetime.strptime(dt.split('.')[0], "%Y-%m-%dT%H:%M:%S") + + class Peer(object): def __init__(self, obj): - self.first_seen = time.time() - self.last_seen = self.first_seen - self.session_id = obj['session_id'] - self.last_channel = obj['channel'] - self.rssi = obj['rssi'] - self.adv = obj['advertisement'] + now = time.time() + just_met = datetime.now().strftime("%Y-%m-%dT%H:%M:%S") + self.first_met = parse_rfc3339(obj.get('met_at', just_met)) + self.first_seen = parse_rfc3339(obj.get('detected_at', just_met)) + self.prev_seen = parse_rfc3339(obj.get('prev_seen_at', just_met)) + self.last_seen = now # should be seen_at + self.encounters = obj.get('encounters', 0) + self.session_id = obj.get('session_id', '') + self.last_channel = obj.get('channel', 1) + self.rssi = obj.get('rssi', 0) + self.adv = obj.get('advertisement', {}) def update(self, new): if self.name() != new.name(): @@ -24,39 +34,45 @@ class Peer(object): self.rssi = new.rssi self.session_id = new.session_id self.last_seen = time.time() + self.prev_seen = new.prev_seen + self.first_met = new.first_met + self.encounters = new.encounters def inactive_for(self): return time.time() - self.last_seen - def _adv_field(self, name, default='???'): - return self.adv[name] if name in self.adv else default + def first_encounter(self): + return self.encounters == 1 + + def days_since_first_met(self): + return (datetime.datetime.now() - self.first_met).days def face(self): - return self._adv_field('face', default=faces.FRIEND) + return self.adv.get('face', faces.FRIEND) def name(self): - return self._adv_field('name') + return self.adv.get('name') def identity(self): - return self._adv_field('identity') + return self.adv.get('identity') def version(self): - return self._adv_field('version') + return self.adv.get('version') def pwnd_run(self): - return int(self._adv_field('pwnd_run', default=0)) + return int(self.adv.get('pwnd_run', 0)) def pwnd_total(self): - return int(self._adv_field('pwnd_tot', default=0)) + return int(self.adv.get('pwnd_tot', 0)) def uptime(self): - return self._adv_field('uptime', default=0) + return self.adv.get('uptime', 0) def epoch(self): - return self._adv_field('epoch', default=0) + return self.adv.get('epoch', 0) def full_name(self): return '%s@%s' % (self.name(), self.identity()) def is_closer(self, other): - return self.rssi > other.rssi + return self.rssi > other.rssi \ No newline at end of file diff --git a/pwnagotchi/mesh/utils.py b/pwnagotchi/mesh/utils.py index 3849acc..8591f4b 100644 --- a/pwnagotchi/mesh/utils.py +++ b/pwnagotchi/mesh/utils.py @@ -53,6 +53,14 @@ class AsyncAdvertiser(object): self._advertisement['face'] = new grid.set_advertisement_data(self._advertisement) + def _on_new_peer(self, peer): + self._view.on_new_peer(peer) + plugins.on('peer_detected', self, peer) + + def _on_lost_peer(self, peer): + self._view.on_lost_peer(peer) + plugins.on('peer_lost', self, peer) + def _adv_poller(self): while True: logging.debug("polling pwngrid-peer for peers ...") @@ -72,24 +80,22 @@ class AsyncAdvertiser(object): to_delete = [] for ident, peer in self._peers.items(): if ident not in new_peers: - self._view.on_lost_peer(peer) - plugins.on('peer_lost', self, peer) to_delete.append(ident) for ident in to_delete: + self._on_lost_peer(peer) del self._peers[ident] for ident, peer in new_peers.items(): # check who's new if ident not in self._peers: self._peers[ident] = peer - self._view.on_new_peer(peer) - plugins.on('peer_detected', self, peer) + self._on_new_peer(peer) # update the rest else: self._peers[ident].update(peer) except Exception as e: - logging.exception("error while polling pwngrid-peer") + logging.warning("error while polling pwngrid-peer: %s" % e) time.sleep(1) diff --git a/scripts/backup.sh b/scripts/backup.sh index f66ca78..71c4f61 100755 --- a/scripts/backup.sh +++ b/scripts/backup.sh @@ -10,6 +10,7 @@ FILES_TO_BACKUP=( /root/brain.json /root/.api-report.json /root/handshakes + /root/peers /etc/pwnagotchi/ /var/log/pwnagotchi.log )