def getDevicesData(meta_db): res = [] for mac, value in config.getConfiguredDevices().items(): metadata = meta_db.query(mac) device_ip = "-" device_active = "false" devname = value["custom_name"] if metadata: if metadata["last_ip"]: device_ip = metadata["last_ip"] if metadata["last_seen"]: device_active = "true" if isActiveDevice(metadata) else "false" if metadata["name"] and not devname: devname = metadata["name"] res.append({ "mac": mac, "name": devname, "user": config.getDeviceUser(mac) or "Others", "ip": device_ip, "active_ping": value["active_ping"], "trigger_activity": value.get("trigger_activity", False), "active": device_active, "policy": value.get("policy", "default"), }) return res
def GET_Devices_JSON(self): mode = self.request_get_mode() if mode == "home": # Configured devices meta_db = MetaDB() return jsonify(getDevicesData(meta_db)) else: self.web_msgqueue[0].send("get_seen_devices") known_macs = config.getConfiguredDevices().keys() # Avoid infinite wait has_message = self.web_msgqueue[0].poll(10) if not has_message: return jsonify([]) seen_devices = pickle.loads(self.web_msgqueue[0].recv()) rv = [] for mac, hostinfo in seen_devices.items(): if not mac in known_macs: rv.append({ "mac": mac, "name": hostinfo.name, "ip": hostinfo.ip, "first_seen": int(hostinfo.first_seen), "last_seen": int(hostinfo.last_seen), }) return jsonify(rv)
def reloadExceptions(self): if self.passive_mode: return devices = config.getConfiguredDevices() now = time.time() nft.run("flush set ip filter cp_whitelisted") nft.run("flush set ip filter cp_blacklisted") nft.run("flush set ip nat cp_whitelisted") nft.run("flush set ip nat cp_blacklisted") for mac, mac_info in devices.items(): policy = mac_info.get("policy", "default") rearp_mac = False spoof_mac = False if ((policy == "pass") or (policy == "capture")): nft.run("add element ip nat cp_whitelisted { %s }" % (mac, )) nft.run("add element ip filter cp_whitelisted { %s }" % (mac, )) if (policy == "pass"): rearp_mac = True elif policy == "block": nft.run("add element ip nat cp_blacklisted { %s }" % (mac, )) nft.run("add element ip filter cp_blacklisted { %s }" % (mac, )) spoof_mac = True elif policy == "default": applied_policy = getDevicePolicy(mac) if applied_policy == "pass": rearp_mac = True if rearp_mac: spoofed_mac = self.macs_to_spoof.pop(mac, None) if spoofed_mac: # The MAC was spoofed, rearp it pkt_reader.arp_rearp(self.handle, mac, spoofed_mac["ip"]) elif spoof_mac and (not self.macs_to_spoof.get(mac)): # Try to find the MAC IP to start blocking it found_ip = None for ip, m in self.ip_to_mac.items(): if m == mac: found_ip = ip break if found_ip: self.macs_to_spoof[mac] = { "last_seen": now, "ip": found_ip }
def GET(self): params = web.input() # TODO handle now timestamp = "now" resolution = "1m" try: timestamp = params.ts resolution = params.res except AttributeError: pass presence_db = PresenceDB() meta_db = MetaDB() ts_start = None ts_end = None if timestamp == "now": ts_end = time.time() ts_start = ts_end - 20 * 60 else: ts_start = int(timestamp) ts_end = makeEndTimestamp(ts_start, resolution) presence_data = presence_db.query(ts_start, ts_end, resolution=resolution) configured_devices = config.getConfiguredDevices() min_time = resToMinTime(resolution) data = [] for device, intervals in presence_data.iteritems(): name = device name_on_packet = "" meta = meta_db.query(device) if meta and meta["name"]: name_on_packet = meta["name"] if device in configured_devices: name = configured_devices[device]["custom_name"] elif name_on_packet: name = name_on_packet for interval in intervals: data.append((name, "", interval[0], interval[1], device, name_on_packet)) data.sort() return template_render.timeline(json.dumps(data, ensure_ascii=True), ts_start, ts_end, resolution, min_time)
def GET_Timeline(self): # TODO handle now timestamp = request.args.get('ts', "now") resolution = request.args.get('res', "1h") presence_db = PresenceDB() meta_db = MetaDB() ts_start = None ts_end = None if timestamp == "now": ts_end = time.time() ts_start = ts_end - 20 * 60 else: ts_start = int(timestamp) ts_end = makeEndTimestamp(ts_start, resolution) presence_data = presence_db.query(ts_start, ts_end, resolution=resolution) configured_devices = config.getConfiguredDevices() min_time = resToMinTime(resolution) data = [] for device, intervals in presence_data.items(): name = device name_on_packet = "" meta = meta_db.query(device) if meta and meta["name"]: name_on_packet = meta["name"] if device in configured_devices: name = configured_devices[device]["custom_name"] elif name_on_packet: name = name_on_packet for interval in intervals: data.append((name, "", interval[0], interval[1], device, name_on_packet)) data.sort() return render_template('timeline.html', intervals_data=json.dumps(data, ensure_ascii=True), timestamp=ts_start, timestamp_end=ts_end, resolution=resolution, chart_min_time=min_time)