Exemple #1
0
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
Exemple #2
0
    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
                    }
Exemple #4
0
    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)
Exemple #5
0
    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)