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)
def test_cuckoo_api(): """Test Distributed Cuckoo's interaction with the Cuckoo API.""" with responses.RequestsMock(assert_all_requests_are_fired=True) as rsps: get(rsps, "/machines/list", json={"machines": "foo"}) assert api.list_machines("http://localhost") == "foo" get(rsps, ":80/cuckoo/status", json={"a": "b"}) assert api.node_status("http://localhost:80") == {"a": "b"} get(rsps, ":8080/cuckoo/status", body="TIMEOUT", status=500) assert api.node_status("http://localhost:8080") is None get(rsps, "/cuckoo/status", body=requests.ConnectionError("foo")) assert api.node_status("http://localhost") is None filepath = tempfile.mktemp() open(filepath, "wb").write("hello") d = { "filename": "bar.exe", "path": filepath, "package": None, "timeout": None, "priority": None, "options": None, "machine": None, "platform": None, "tags": None, "custom": None, "owner": None, "memory": None, "clock": None, "enforce_timeout": None, } post(rsps, ":80/tasks/create/file", json={"task_id": 12345}) assert api.submit_task("http://localhost:80", d) == 12345 post(rsps, ":8080/tasks/create/file", body=requests.ConnectionError("a")) assert api.submit_task("http://localhost:8080", d) is None get(rsps, "/tasks/list/100", json={"tasks": ["foo"]}) assert api.fetch_tasks("http://localhost", "finished", 100) == ["foo"] get(rsps, "/tasks/report/1/json", body="A" * 1024 * 1024 * 8) dirpath = tempfile.mkdtemp() r = api.store_report("http://localhost", 1, "json", dirpath) assert r == (1, "json") buf = open(os.path.join(dirpath, "report.json"), "rb").read() assert buf == "A" * 1024 * 1024 * 8 get(rsps, "/tasks/delete/42") assert api.delete_task("http://localhost", 42) get(rsps, "/pcap/get/123", body="A" * 1024) filepath = tempfile.mktemp() assert api.fetch_pcap("http://localhost", 123, filepath) is None assert open(filepath, "rb").read() == "A" * 1024
def test_cuckoo_api(): """Test Distributed Cuckoo's interaction with the Cuckoo API.""" with responses.RequestsMock(assert_all_requests_are_fired=True) as rsps: get(rsps, "/machines/list", json={"machines": "foo"}) assert api.list_machines("http://localhost") == "foo" get(rsps, "/cuckoo/status", json={"a": "b"}) assert api.node_status("http://localhost") == {"a": "b"} get(rsps, "/cuckoo/status", body="TIMEOUT", status=500) assert api.node_status("http://localhost") is None get(rsps, "/cuckoo/status", body=requests.ConnectionError("foo")) assert api.node_status("http://localhost") is None filepath = tempfile.mktemp() open(filepath, "wb").write("hello") d = { "filename": "bar.exe", "path": filepath, "package": None, "timeout": None, "priority": None, "options": None, "machine": None, "platform": None, "tags": None, "custom": None, "owner": None, "memory": None, "clock": None, "enforce_timeout": None, } post(rsps, "/tasks/create/file", json={"task_id": 12345}) assert api.submit_task("http://localhost", d) == 12345 post(rsps, "/tasks/create/file", body=requests.ConnectionError("a")) assert api.submit_task("http://localhost", d) is None get(rsps, "/tasks/list/100", json={"tasks": ["foo"]}) assert api.fetch_tasks("http://localhost", "finished", 100) == ["foo"] get(rsps, "/tasks/report/1/json", body="A"*1024*1024*8) dirpath = tempfile.mkdtemp() r = api.store_report("http://localhost", 1, "json", dirpath) assert r == (1, "json") buf = open(os.path.join(dirpath, "report.json"), "rb").read() assert buf == "A"*1024*1024*8 get(rsps, "/tasks/delete/42") assert api.delete_task("http://localhost", 42) get(rsps, "/pcap/get/123", body="A"*1024) filepath = tempfile.mktemp() assert api.fetch_pcap("http://localhost", 123, filepath) is None assert open(filepath, "rb").read() == "A"*1024