Skip to content

Instantly share code, notes, and snippets.

@ikiril01
Last active January 20, 2016 16:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ikiril01/51d1803d6a917789c786 to your computer and use it in GitHub Desktop.
Save ikiril01/51d1803d6a917789c786 to your computer and use it in GitHub Desktop.
CybOX Visualization Test
{
"name": "CybOX 3.0",
"children": [
{"name":"Core Components",
"children": [{"name":"CybOX Core", "size": 5234},
{"name":"CybOX Common", "size":3434},
{"name":"CybOX Vocabularies", "size":2343}]
},
{
"name": "Objects",
"children":[{"name":"Network Objects",
"size": 12000,
"children":[{"name":"AS", "size":1500},
{"name":"Address", "size":3000,
"children":[{"name":"IPv4 Address", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-Address-Object-Refactoring#refactoring---new-objects"},
{"name":"IPv6 Address", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-Address-Object-Refactoring#refactoring---new-objects"},
{"name":"IP Address", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-Address-Object-Refactoring#refactoring---new-objects"},
{"name":"MAC Address", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-Address-Object-Refactoring#refactoring---new-objects"},
{"name":"Email Address", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-Address-Object-Refactoring#refactoring---new-objects"}]},
{"name":"DNS Cache", "size":1500},
{"name":"DNS Query", "size":1500},
{"name":"DNS Record", "size":1500},
{"name":"Domain Name", "size":1200},
{"name":"Net Route", "size":1500},
{"name":"Network Connection", "size":1800, "likely_update":true},
{"name":"Network Flow", "size":2400},
{"name":"Network Packet", "size":2700, "likely_update":true},
{"name":"Network Subnet", "size":1200},
{"name":"Socket Address", "size":1200},
{"name":"Port", "size":900},
{"name":"URI", "size":900},
{"name":"WHO_IS", "size":1500}
]},
{"name":"Host-related Objects", "size": 20000,
"children":[{"name":"File-related", "size":8000,
"children":[{"name":"File", "size":2000,
"children":[{"name":"File Metadata Extension", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#filemetadataextension"},
{"name":"EXT3 File Extension", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#ext3fileextension"},
{"name":"NTFS File Extension", "size":900, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#ntfsfileextension"},
{"name":"Image File Extension", "size":1200, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#imagefileextension"},
{"name":"PDF File Extension", "size":1200, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#pdffileextension"},
{"name":"PE File Extension", "size":1500, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#pebinaryfileextension"},
{"name":"Archive File Extension", "size":1200, "is_new":true,
"url":"https://github.com/CybOXProject/schemas/wiki/CybOX-3.0:-File-Object-Refactoring#archivefileextension"}]},
{"name":"Pipe", "size":900, "likely_update":"true"},
{"name":"UNIX Pipe", "size":900, "likely_update":"true"},
{"name":"Windows Pipe", "size":900, "likely_update":"true"},
{"name":"Windows Filemapping", "size":1200},
{"name":"Library", "size":900, "likely_update":true}]},
{"name":"Disk-related", "size":4000,
"children":[{"name":"Disk", "size":1200, "likely_update":true},
{"name":"Disk Partition", "size":900},
{"name":"Volume", "size":1200},
{"name":"UNIX Volume", "size":1200},
{"name":"Windows Volume", "size":1200}]},
{"name":"OS Metadata", "size":12000},
{"name":"Logging", "size":2400,
"children":[{"name":"Windows Event", "size":1200},
{"name":"Windows Event Log", "size":1200}]},
{"name":"SMS Message", "size":900},
{"name":"Network-Related", "size":10000,
"children":[{"name":"ARP Cache", "size":1200},
{"name":"Network Route Entry", "size":1200},
{"name":"Unix Network Route Entry", "size":900},
{"name":"Windows Network Route Entry", "size":900},
{"name":"Network Socket", "size":900},
{"name":"URL History", "size":1200}]},
{"name":"Misc.", "size":5000}
]}]
}
]
}
<!DOCTYPE html>
<html xmlns:xlink="http://www.w3.org/1999/xlink">
<meta charset="utf-8">
<style>
.node {
cursor: pointer;
}
.node:hover {
stroke: #000;
stroke-width: 1.5px;
}
.node--leaf {
fill: white;
}
.label {
font: 13px "Helvetica Neue", Helvetica, Arial, sans-serif;
text-anchor: middle;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
}
.label,
.node--root,
.node--leaf {
pointer-events: none;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var margin = 20,
diameter = 1080;
var color = d3.scale.linear()
.domain([-1, 6])
.range(["hsl(152,80%,80%)", "hsl(228,30%,40%)"])
.interpolate(d3.interpolateHcl);
var pack = d3.layout.pack()
.padding(2)
.size([diameter - margin, diameter - margin])
.value(function(d) { return d.size; })
var svg = d3.select("body").append("svg")
.attr("width", diameter)
.attr("height", diameter)
.append("g")
.attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");
d3.json("cybox_hierarchy.json", function(error, root) {
if (error) throw error;
var focus = root,
nodes = pack.nodes(root),
view;
var circle = svg.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("title", function(d) { return d.name; })
.attr("class", function(d) { if (d.is_new || d.likely_update || d.likely_deprecate) {
return "node";
} else if (d.name == "CybOX 3.0") {
return "node node--root";
} else if (d.children) {
return "node";
} else {
return "node node--leaf";
}})
.style("fill", function(d) { if(d.children) {
return color(d.depth);
} else if (d.is_new) {
return "limegreen";
} else if (d.not_included) {
return "mediumpurple";
} else if (d.likely_update) {
return "palegoldenrod";
} else if (d.likely_deprecate) {
return "tomato";
} else {
return null;
}})
.on("click", function (d) {
if (d.is_new || d.likely_update || d.likely_deprecate) {
var win = window.open(d.url, '_blank');
}
if (focus !== d) zoom(d), d3.event.stopPropagation();
});
var text = svg.selectAll("text")
.data(nodes)
.enter().append("text")
.attr("class", "label")
.style("fill-opacity", function(d) { return d.parent === root ? 1 : 0; })
.style("display", function(d) { return d.parent === root ? "inline" : "none"; })
.text(function(d) { return d.name; })
var node = svg.selectAll("circle,text");
d3.select("body")
.style("background", color(-1))
.on("click", function() { zoom(root); });
zoomTo([root.x, root.y, root.r * 2 + margin]);
function zoom(d) {
if (!(d.is_new || d.likely_update || d.likely_deprecate)) {
var focus0 = focus; focus = d;
var transition = d3.transition()
.duration(d3.event.altKey ? 7500 : 750)
.tween("zoom", function(d) {
var i = d3.interpolateZoom(view, [focus.x, focus.y, focus.r * 2 + margin]);
return function(t) { zoomTo(i(t)); };
});
transition.selectAll("text")
.filter(function(d) { return d.parent === focus || this.style.display === "inline"; })
.style("fill-opacity", function(d) { return d.parent === focus ? 1 : 0; })
.each("start", function(d) { if (d.parent === focus) this.style.display = "inline"; })
.each("end", function(d) { if (d.parent !== focus) this.style.display = "none"; });
}}
function zoomTo(v) {
var k = diameter / v[2]; view = v;
node.attr("transform", function(d) { return "translate(" + (d.x - v[0]) * k + "," + (d.y - v[1]) * k + ")"; });
circle.attr("r", function(d) { return d.r * k; });
}
});
d3.select(self.frameElement).style("height", diameter + "px");
</script>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment