small refactoring to facilitate integration of the bond equation

This commit is contained in:
Simone Margaritelli 2019-10-23 15:20:16 +02:00
parent 23ef17d4c7
commit 3ad426916f
4 changed files with 46 additions and 22 deletions

@ -31,6 +31,7 @@ main:
- /root/brain.json - /root/brain.json
- /root/.api-report.json - /root/.api-report.json
- /root/handshakes/ - /root/handshakes/
- /root/peers/
- /etc/pwnagotchi/ - /etc/pwnagotchi/
- /var/log/pwnagotchi.log - /var/log/pwnagotchi.log
commands: commands:

@ -1,17 +1,27 @@
import time import time
import logging import logging
import datetime
import pwnagotchi.ui.faces as faces 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): class Peer(object):
def __init__(self, obj): def __init__(self, obj):
self.first_seen = time.time() now = time.time()
self.last_seen = self.first_seen just_met = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
self.session_id = obj['session_id'] self.first_met = parse_rfc3339(obj.get('met_at', just_met))
self.last_channel = obj['channel'] self.first_seen = parse_rfc3339(obj.get('detected_at', just_met))
self.rssi = obj['rssi'] self.prev_seen = parse_rfc3339(obj.get('prev_seen_at', just_met))
self.adv = obj['advertisement'] 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): def update(self, new):
if self.name() != new.name(): if self.name() != new.name():
@ -24,39 +34,45 @@ class Peer(object):
self.rssi = new.rssi self.rssi = new.rssi
self.session_id = new.session_id self.session_id = new.session_id
self.last_seen = time.time() 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): def inactive_for(self):
return time.time() - self.last_seen return time.time() - self.last_seen
def _adv_field(self, name, default='???'): def first_encounter(self):
return self.adv[name] if name in self.adv else default return self.encounters == 1
def days_since_first_met(self):
return (datetime.datetime.now() - self.first_met).days
def face(self): def face(self):
return self._adv_field('face', default=faces.FRIEND) return self.adv.get('face', faces.FRIEND)
def name(self): def name(self):
return self._adv_field('name') return self.adv.get('name')
def identity(self): def identity(self):
return self._adv_field('identity') return self.adv.get('identity')
def version(self): def version(self):
return self._adv_field('version') return self.adv.get('version')
def pwnd_run(self): 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): def pwnd_total(self):
return int(self._adv_field('pwnd_tot', default=0)) return int(self.adv.get('pwnd_tot', 0))
def uptime(self): def uptime(self):
return self._adv_field('uptime', default=0) return self.adv.get('uptime', 0)
def epoch(self): def epoch(self):
return self._adv_field('epoch', default=0) return self.adv.get('epoch', 0)
def full_name(self): def full_name(self):
return '%s@%s' % (self.name(), self.identity()) return '%s@%s' % (self.name(), self.identity())
def is_closer(self, other): def is_closer(self, other):
return self.rssi > other.rssi return self.rssi > other.rssi

@ -53,6 +53,14 @@ class AsyncAdvertiser(object):
self._advertisement['face'] = new self._advertisement['face'] = new
grid.set_advertisement_data(self._advertisement) 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): def _adv_poller(self):
while True: while True:
logging.debug("polling pwngrid-peer for peers ...") logging.debug("polling pwngrid-peer for peers ...")
@ -72,24 +80,22 @@ class AsyncAdvertiser(object):
to_delete = [] to_delete = []
for ident, peer in self._peers.items(): for ident, peer in self._peers.items():
if ident not in new_peers: if ident not in new_peers:
self._view.on_lost_peer(peer)
plugins.on('peer_lost', self, peer)
to_delete.append(ident) to_delete.append(ident)
for ident in to_delete: for ident in to_delete:
self._on_lost_peer(peer)
del self._peers[ident] del self._peers[ident]
for ident, peer in new_peers.items(): for ident, peer in new_peers.items():
# check who's new # check who's new
if ident not in self._peers: if ident not in self._peers:
self._peers[ident] = peer self._peers[ident] = peer
self._view.on_new_peer(peer) self._on_new_peer(peer)
plugins.on('peer_detected', self, peer)
# update the rest # update the rest
else: else:
self._peers[ident].update(peer) self._peers[ident].update(peer)
except Exception as e: except Exception as e:
logging.exception("error while polling pwngrid-peer") logging.warning("error while polling pwngrid-peer: %s" % e)
time.sleep(1) time.sleep(1)

@ -10,6 +10,7 @@ FILES_TO_BACKUP=(
/root/brain.json /root/brain.json
/root/.api-report.json /root/.api-report.json
/root/handshakes /root/handshakes
/root/peers
/etc/pwnagotchi/ /etc/pwnagotchi/
/var/log/pwnagotchi.log /var/log/pwnagotchi.log
) )