def node_post(): if "name" not in request.form: return json_error(404, "Missing node name") if "ip" not in request.form and "url" not in request.form: return json_error(404, "Missing IP address or direct URL") if Node.query.filter_by(name=request.form["name"]).first(): return json_error(409, "There is already a node with this name") url = node_url(ip=request.form.get("ip"), url=request.form.get("url")) node = Node(name=request.form["name"], url=url, mode=request.form.get("mode", "normal")) try: machines = list_machines(url) except Exception as e: return json_error(404, "Error connecting to Cuckoo node: %s", e) for machine in machines: m = Machine(name=machine["name"], platform=machine["platform"], tags=machine["tags"]) node.machines.append(m) db.session.add(m) db.session.add(node) db.session.commit() return jsonify(success=True, machines=machines)
def node_refresh(name): node = Node.query.filter_by(name=name).first() if not node: return json_error(404, "No such node") try: machines = list_machines(node.url) except Exception as e: return json_error(404, "Error connecting to Cuckoo node: %s", e) machines_existing = {} for machine in node.machines: machine_values = machine.name, machine.platform machines_existing[machine_values] = machine # Add new machines. for machine in machines: machine_values = machine["name"], machine["platform"] if machine_values in machines_existing: # Update the associated tags for this machine. machines_existing[machine_values].tags = machine["tags"] del machines_existing[machine_values] continue m = Machine(name=machine["name"], platform=machine["platform"], tags=machine["tags"]) node.machines.append(m) db.session.add(m) # Unlink older machines. for machine in machines_existing.values(): node.machines.remove(machine) db.session.commit() return jsonify(success=True, machines=machines)