Compare commits

..

3 Commits

Author SHA1 Message Date
fe956b853e Merge pull request 'work' (#3) from work into master
Reviewed-on: #3
2025-08-18 20:19:27 +00:00
0960fe5bf6 Merge pull request 'Fixing image build process' (#2) from work into master
Reviewed-on: #2
2024-11-25 09:16:47 -06:00
9a33b82b42 Merge pull request 'work' (#1) from work into master
Reviewed-on: #1
2024-11-25 09:09:53 -06:00

View File

@@ -1,90 +1,68 @@
<html> <html>
<head> <head>
<title>Visual Subnet Calculator</title> <title>Visual Subnet Calculator</title>
<script src="calculations_4.js"></script>
<script src="calculations_6.js"></script>
<script src="calculations.js"></script>
<script language="javascript" type="text/javascript"> <script language="javascript" type="text/javascript">
<!--
var curNetwork = 0; var curNetwork = 0;
var curMask = 0; var curMask = 0;
var curVersion = 4;
var curComments = {}; var curComments = {};
function updateNetwork() { function updateNetwork()
var newNetworkStr = document.forms["calc"].elements["network"].value; {
var newMask = parseInt( var newNetworkStr = document.forms['calc'].elements['network'].value;
document.forms["calc"].elements["netbits"].value var newMask = parseInt(document.forms['calc'].elements['netbits'].value);
);
var newVersion = parseInt(
document.forms["calc"].elements["version"].value
);
var newNetwork = inet_aton(newVersion, newNetworkStr); var newNetwork = inet_aton(newNetworkStr);
if (newNetwork === null) { if (newNetwork === null) {
alert("Invalid network address entered"); alert('Invalid network address entered');
return; return;
} }
var tmpNetwork = network_address(newVersion, newNetwork, newMask); var tmpNetwork = network_address(newNetwork, newMask);
if (newNetwork != tmpNetwork) { if (newNetwork != tmpNetwork) {
alert( alert('The network address entered is not on a network boundary for this mask.\nIt has been changed to '+inet_ntoa(tmpNetwork)+'.');
"The network address entered is not on a network boundary for this mask.\nIt has been changed to " +
inet_ntoa(newVersion, tmpNetwork) +
"."
);
newNetwork = tmpNetwork; newNetwork = tmpNetwork;
document.forms["calc"].elements["network"].value = inet_ntoa( document.forms['calc'].elements['network'].value = inet_ntoa(tmpNetwork);
newVersion,
tmpNetwork
);
} }
if ((newVersion == 4 && (newMask < 0 || newMask > 32)) || (newVersion == 6 && (newMask < 0 || newMask > 128))) { if (newMask < 0 || newMask > 32) {
alert("The network mask you have entered is invalid"); alert('The network mask you have entered is invalid');
return; return;
} }
if (curMask == 0) { if (curMask == 0) {
curMask = newMask; curMask = newMask;
curNetwork = newNetwork; curNetwork = newNetwork;
curVersion = newVersion;
startOver(); startOver();
} else if ( }
(curMask != newMask || curVersion != newVersion) && else if (curMask != newMask && confirm('You are changing the base network from /'+curMask+' to /'+newMask+'. This will reset any changes you have made. Proceed?')) {
confirm(
"You are changing the base network from /" +
curMask + "(v" + curVersion +
") to /" +
newMask + "(v" + newVersion +
"). This will reset any changes you have made. Proceed?"
)
) {
curMask = newMask; curMask = newMask;
curNetwork = newNetwork; curNetwork = newNetwork;
curVersion = newVersion;
startOver(); startOver();
} else { }
document.forms["calc"].elements["netbits"].value = curMask; else {
document.forms['calc'].elements['netbits'].value = curMask;
curNetwork = newNetwork; curNetwork = newNetwork;
recreateTables(); recreateTables();
} }
} }
function startOver() { function startOver()
{
rootSubnet = [0, 0, null]; rootSubnet = [0, 0, null];
recreateTables(); recreateTables();
} }
function recreateTables() { function recreateTables()
var calcbody = document.getElementById("calcbody"); {
var calcbody = document.getElementById('calcbody');
if (!calcbody) { if (!calcbody) {
alert("Body not found"); alert('Body not found');
return; return;
} }
@@ -95,21 +73,10 @@ var curComments = {};
updateNumChildren(rootSubnet); updateNumChildren(rootSubnet);
updateDepthChildren(rootSubnet); updateDepthChildren(rootSubnet);
createRow( createRow(calcbody, rootSubnet, curNetwork, curMask, [curMask, rootSubnet[1], rootSubnet], rootSubnet[0]);
calcbody,
rootSubnet,
curNetwork,
curMask,
[curMask, rootSubnet[1], rootSubnet],
rootSubnet[0]
);
document.getElementById("joinHeader").colSpan = document.getElementById('joinHeader').colSpan = (rootSubnet[0] > 0 ? rootSubnet[0] : 1);
rootSubnet[0] > 0 ? rootSubnet[0] : 1; document.getElementById('col_join').span = (rootSubnet[0] > 0 ? rootSubnet[0] : 1);
document.getElementById("col_join").span =
rootSubnet[0] > 0 ? rootSubnet[0] : 1;
/* Create the bookmark hyperlink */
/* Disable joins for subnets with comments. */ /* Disable joins for subnets with comments. */
var joinLocks = {}; // a unique collection of join elements to disable var joinLocks = {}; // a unique collection of join elements to disable
@@ -144,21 +111,25 @@ function createBookmarkHyperlink() {
+'&comments='+encodeURIComponent(JSON.stringify(curComments)); +'&comments='+encodeURIComponent(JSON.stringify(curComments));
} }
} }
function nodeToString(node) {
function nodeToString(node)
{
if (node[2]) { if (node[2]) {
return "1" + nodeToString(node[2][0]) + nodeToString(node[2][1]); return '1'+nodeToString(node[2][0])+nodeToString(node[2][1]);
} else { }
return "0"; else {
return '0';
} }
} }
function binToAscii(str) { function binToAscii(str)
var curOut = ""; {
var curOut = '';
var curBit = 0; var curBit = 0;
var curChar = 0; var curChar = 0;
for (var i=0; i<str.length; i++) { for (var i=0; i<str.length; i++) {
if (str.charAt(i) == "1") { if (str.charAt(i) == '1') {
curChar |= 1<<curBit; curChar |= 1<<curBit;
} }
curBit++; curBit++;
@@ -171,114 +142,95 @@ function createBookmarkHyperlink() {
if (curBit > 0) { if (curBit > 0) {
curOut += curChar.toString(16); curOut += curChar.toString(16);
} }
return str.length + "." + curOut; return str.length+'.'+curOut;
} }
function asciiToBin(str) { function asciiToBin(str)
{
var re = /([0-9]+)\.([0-9a-f]+)/; var re = /([0-9]+)\.([0-9a-f]+)/;
var res = re.exec(str); var res = re.exec(str);
var len = res[1]; var len = res[1];
var encoded = res[2]; var encoded = res[2];
var out = ""; var out = '';
for (var i=0; i< res[1]; i++) { for (var i=0; i< res[1]; i++) {
var ch = parseInt(res[2].charAt(Math.floor(i/4)), 16); var ch = parseInt(res[2].charAt(Math.floor(i/4)), 16);
var pos = i % 4; var pos = i % 4;
out += ch & (1 << pos) ? "1" : "0"; out += (ch & (1<<pos) ? '1' : '0');
} }
return out; return out;
} }
function createRow(calcbody, node, address, mask, labels, depth) { // Recursive function that creates rows working from the outer most mask and working inwards
if (node[2]) { function createRow(calcbody, node, address, mask, labels, depth)
{
if (node[2]) { // We need to go deeper
var newlabels = labels; var newlabels = labels;
newlabels.push(mask+1); newlabels.push(mask+1);
newlabels.push(node[2][0][1]); newlabels.push(node[2][0][1]);
newlabels.push(node[2][0]); newlabels.push(node[2][0]);
createRow( createRow(calcbody, node[2][0], address, mask+1, newlabels, depth-1);
calcbody,
node[2][0],
address,
mask + 1,
newlabels,
depth - 1
);
newlabels = new Array(); newlabels = new Array();
newlabels.push(mask+1); newlabels.push(mask+1);
newlabels.push(node[2][1][1]); newlabels.push(node[2][1][1]);
newlabels.push(node[2][1]); newlabels.push(node[2][1]);
createRow( createRow(calcbody, node[2][1], address+subnet_addresses(mask+1), mask+1, newlabels, depth-1);
calcbody, }
node[2][1], else { // Actually create a row
address + subnet_addresses(curVersion, mask + 1), var newRow = document.createElement('TR');
mask + 1,
newlabels,
depth - 1
);
} else {
var newRow = document.createElement("TR");
calcbody.appendChild(newRow); calcbody.appendChild(newRow);
/* subnet address */ /* subnet address */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newCell.appendChild( newCell.appendChild(document.createTextNode(inet_ntoa(address)+'/'+mask));
document.createTextNode(inet_ntoa(curVersion, address) + "/" + mask)
);
newRow.appendChild(newCell); newRow.appendChild(newCell);
var addressFirst = address; var addressFirst = address;
var addressLast = subnet_last_address(curVersion, address, mask); var addressLast = subnet_last_address(address, mask);
var useableFirst = subnet_first_address_useable(curVersion, address); var useableFirst = address + 1;
var useableLast = subnet_last_address_useable(curVersion, addressLast); var useableLast = addressLast - 1;
var numHosts; var numHosts;
var addressRange; var addressRange;
var usaebleRange; var usaebleRange;
var comment = curComments[inet_ntoa(address) + "/" + mask] || null; var comment = curComments[inet_ntoa(address) + "/" + mask] || null;
if ((curVersion == 4 && mask == 32) || (curVersion == 6 && mask == 128)) {
addressRange = inet_ntoa(curVersion, addressFirst); if (mask == 32) {
addressRange = inet_ntoa(addressFirst);
useableRange = addressRange; useableRange = addressRange;
numHosts = 1; numHosts = 1;
} else { }
addressRange = else {
inet_ntoa(curVersion, addressFirst) + addressRange = inet_ntoa(addressFirst)+' - '+inet_ntoa(addressLast);
" - " + if (mask == 31) {
inet_ntoa(curVersion, addressLast);
if ( (curVersion == 4 && mask == 31) || (curVersion == 6 && mask == 127)) {
useableRange = addressRange; useableRange = addressRange;
numHosts = 2; numHosts = 2;
} else { }
useableRange = else {
inet_ntoa(curVersion, useableFirst) + useableRange = inet_ntoa(useableFirst)+' - '+inet_ntoa(useableLast);
" - " + numHosts = (1 + useableLast - useableFirst);
inet_ntoa(curVersion, useableLast);
numHosts = num_hosts(curVersion, useableFirst, useableLast);
} }
} }
/* netmask */ /* netmask */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
var netmask = subnet_netmask(curVersion, mask); newCell.appendChild(document.createTextNode(inet_ntoa(subnet_netmask(mask))));
if (netmask) {
newCell.appendChild(
document.createTextNode(inet_ntoa(curVersion, netmask))
);
}
newRow.appendChild(newCell); newRow.appendChild(newCell);
/* range of addresses */ /* range of addresses */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newCell.appendChild(document.createTextNode(addressRange)); newCell.appendChild(document.createTextNode(addressRange));
newRow.appendChild(newCell); newRow.appendChild(newCell);
/* useable addresses */ /* useable addresses */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newCell.appendChild(document.createTextNode(useableRange)); newCell.appendChild(document.createTextNode(useableRange));
newRow.appendChild(newCell); newRow.appendChild(newCell);
/* Hosts */ /* Hosts */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newCell.appendChild(document.createTextNode(numHosts)); newCell.appendChild(document.createTextNode(numHosts));
newRow.appendChild(newCell); newRow.appendChild(newCell);
/* Comments */ /* Comments */
var newCell = document.createElement('TD'); var newCell = document.createElement('TD');
var textarea = document.createElement('TEXTAREA'); var textarea = document.createElement('TEXTAREA');
@@ -309,49 +261,48 @@ var comment = curComments[inet_ntoa(address) + "/" + mask] || null;
newCell.appendChild(textarea); newCell.appendChild(textarea);
newRow.appendChild(newCell); newRow.appendChild(newCell);
/* actions */ /* actions */
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newRow.appendChild(newCell); newRow.appendChild(newCell);
if ((curVersion == 4 && mask == 32) || (curVersion == 6 && mask == 128)) { if (mask == 32 || comment != null) {
var newLink = document.createElement("SPAN"); var newLink = document.createElement('SPAN');
newLink.className = "disabledAction"; newLink.className = 'disabledAction';
newLink.appendChild(document.createTextNode("Divide")); newLink.appendChild(document.createTextNode('Divide'));
newCell.appendChild(newLink); newCell.appendChild(newLink);
} else { }
var newLink = document.createElement("A"); else {
newLink.href = "#"; var newLink = document.createElement('A');
newLink.onclick = function () { newLink.href = '#';
divide(node); newLink.onclick = function () { divide(node); return false; }
return false; newLink.appendChild(document.createTextNode('Divide'));
};
newLink.appendChild(document.createTextNode("Divide"));
newCell.appendChild(newLink); newCell.appendChild(newLink);
} }
var colspan = depth - node[0]; var colspan = depth - node[0];
for (var i = labels.length / 3 - 1; i >= 0; i--) { for (var i=(labels.length/3)-1; i>=0; i--) {
var mask = labels[i*3]; var mask = labels[i*3];
var rowspan = labels[i * 3 + 1]; var rowspan = labels[(i*3)+1];
var joinnode = labels[i * 3 + 2]; var joinnode = labels[(i*3)+2];
var newCell = document.createElement("TD"); var newCell = document.createElement('TD');
newCell.rowSpan = rowspan > 1 ? rowspan : 1; newCell.rowSpan = (rowspan > 1 ? rowspan : 1);
newCell.colSpan = colspan > 1 ? colspan : 1; newCell.colSpan = (colspan > 1 ? colspan : 1);
newCell.id = "join_" + inet_ntoa(network_address(address, mask)) + "/" + mask;
if (i == labels.length / 3 - 1) { if (i == (labels.length/3)-1) {
newCell.className = "maskSpan"; newCell.className = 'maskSpan';
} else { }
newCell.className = "maskSpanJoinable"; else {
newCell.className = 'maskSpanJoinable';
newCell.onclick = newJoin(joinnode); newCell.onclick = newJoin(joinnode);
// newCell.onmouseover = function() { window.status = joinnode[0]+'---'+joinnode[1]+'---'+joinnode[2]+'>>>>>'+node[2];} // newCell.onmouseover = function() { window.status = joinnode[0]+'---'+joinnode[1]+'---'+joinnode[2]+'>>>>>'+node[2];}
} }
var newImg = document.createElement("IMG"); var newImg = document.createElement('IMG');
newImg.src = "img/" + mask + ".gif"; newImg.src = 'img/'+mask+'.gif';
newCell.appendChild(newImg); newCell.appendChild(newImg);
newRow.appendChild(newCell); newRow.appendChild(newCell);
@@ -361,89 +312,159 @@ var comment = curComments[inet_ntoa(address) + "/" + mask] || null;
} }
/* This is necessary because 'joinnode' changes during the scope of the caller */ /* This is necessary because 'joinnode' changes during the scope of the caller */
function newJoin(joinnode) { function newJoin(joinnode)
{
return function() { return function() {
join(joinnode); join(joinnode);
return false; // prevent click event
}; };
} }
function divide(node) { function divide(node)
{
node[2] = new Array(); node[2] = new Array();
node[2][0] = [0, 0, null]; node[2][0] = [0, 0, null];
node[2][1] = [0, 0, null]; node[2][1] = [0, 0, null];
recreateTables(); recreateTables();
} }
function join(node) { function join(node)
{
/* easy as pie */ /* easy as pie */
node[2] = null; node[2] = null;
recreateTables(); recreateTables();
} }
function updateNumChildren(node) { function updateNumChildren(node)
{
if (node[2] == null) { if (node[2] == null) {
node[1] = 0; node[1] = 0;
return 1; return 1;
} else { }
node[1] = else {
updateNumChildren(node[2][0]) + updateNumChildren(node[2][1]); node[1] = updateNumChildren(node[2][0]) + updateNumChildren(node[2][1]);
return node[1]; return node[1];
} }
} }
function updateDepthChildren(node) { function updateDepthChildren(node)
{
if (node[2] == null) { if (node[2] == null) {
node[0] = 0; node[0] = 0;
return 1; return 1;
} else { }
node[0] = else {
updateDepthChildren(node[2][0]) + updateDepthChildren(node[2][1]); node[0] = updateDepthChildren(node[2][0]) + updateDepthChildren(node[2][1]);
return node[1]; return node[1];
} }
} }
var rootSubnet; var rootSubnet;
// each node is Array: // each node is Array:
// [0] => depth of children, total number of visible children, children // [0] => depth of children, total number of visible children, children
function preloadSubnetImages() {
function inet_ntoa(addrint)
{
return ((addrint >> 24) & 0xff)+'.'+
((addrint >> 16) & 0xff)+'.'+
((addrint >> 8) & 0xff)+'.'+
(addrint & 0xff);
}
function inet_aton(addrstr)
{
var re = /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/;
var res = re.exec(addrstr);
if (res === null) {
return null;
}
for (var i=1; i<=4; i++) {
if (res[i] < 0 || res[i] > 255) {
return null;
}
}
return (res[1] << 24) | (res[2] << 16) | (res[3] << 8) | res[4];
}
function network_address(ip, mask)
{
var maskbits = 0;
for (var i=31-mask; i>=0; i--) {
ip &= ~ 1<<i;
}
return ip;
}
function subnet_addresses(mask)
{
return 1<<(32-mask);
}
function subnet_last_address(subnet, mask)
{
return subnet + subnet_addresses(mask) - 1;
}
function subnet_netmask(mask)
{
return network_address(0xffffffff, mask);
}
function preloadSubnetImages()
{
if (document.images) { if (document.images) {
if (!document.preloadedImages) { if (!document.preloadedImages) {
document.preloadedImages = new Array(); document.preloadedImages = new Array();
} }
for (var i = 0; i <= 128; i++) { for (var i=0; i<=32; i++) {
var img = new Image(); var img = new Image();
img.src = "img/" + i + ".gif"; img.src = 'img/'+i+'.gif';
document.preloadedImages.push(img); document.preloadedImages.push(img);
} }
} }
} }
function calcOnLoad() {
function calcOnLoad()
{
preloadSubnetImages(); preloadSubnetImages();
args = parseQueryString(); args = parseQueryString();
if (args["network"] && args["mask"] && args["division"]) { if (args['network'] && args['mask'] && args['division']) {
document.forms["calc"].elements["version"].value = args["version"] || 4; document.forms['calc'].elements['network'].value = args['network'];
document.forms["calc"].elements["network"].value = args["network"]; document.forms['calc'].elements['netbits'].value = args['mask'];
document.forms["calc"].elements["netbits"].value = args["mask"];
if (args['comments']) {
curComments = JSON.parse(args['comments']);
} else {
curComments = {};
}
updateNetwork(); updateNetwork();
var division = asciiToBin(args["division"]); var division = asciiToBin(args['division']);
rootSubnet = [0, 0, null]; rootSubnet = [0, 0, null];
if (division != "0") { if (division != '0') {
loadNode(rootSubnet, division); loadNode(rootSubnet, division);
} }
recreateTables(); recreateTables();
} else { }
else {
updateNetwork(); updateNetwork();
} }
} }
function loadNode(curNode, division) { function loadNode(curNode, division)
if (division.charAt(0) == "0") { {
if (division.charAt(0) == '0') {
return division.substr(1); return division.substr(1);
} else { }
else {
curNode[2] = new Array(); curNode[2] = new Array();
curNode[2][0] = [0, 0, null]; curNode[2][0] = [0, 0, null];
curNode[2][1] = [0, 0, null]; curNode[2][1] = [0, 0, null];
@@ -454,19 +475,18 @@ var comment = curComments[inet_ntoa(address) + "/" + mask] || null;
} }
} }
function parseQueryString (str) function parseQueryString (str)
{ {
str = str ? str : location.search; str = str ? str : location.search;
var query = str.charAt(0) == "?" ? str.substring(1) : str; var query = str.charAt(0) == '?' ? str.substring(1) : str;
var args = new Object(); var args = new Object();
if (query) { if (query) {
var fields = query.split("&"); var fields = query.split('&');
for (var f = 0; f < fields.length; f++) { for (var f = 0; f < fields.length; f++) {
var field = fields[f].split("="); var field = fields[f].split('=');
args[unescape(field[0].replace(/\+/g, ' '))] =
args[unescape(field[0].replace(/\+/g, " "))] = unescape( unescape(field[1].replace(/\+/g, ' '));
field[1].replace(/\+/g, " ")
);
} }
} }
return args; return args;
@@ -526,6 +546,7 @@ P {
font-weight: bold; font-weight: bold;
background-color: #eeeeee; background-color: #eeeeee;
} }
.calc textarea { .calc textarea {
height: 1.5em; height: 1.5em;
} }
@@ -541,7 +562,7 @@ P {
.maskSpanJoinable { .maskSpanJoinable {
background-color: #cccccc; background-color: #cccccc;
text-align: right; text-align: right;
cursor: hand; cursor: grab;
} }
.maskSpanRotate { .maskSpanRotate {
@@ -565,18 +586,13 @@ P {
<table cellspacing="0"> <table cellspacing="0">
<tr> <tr>
<td class="label">IPv4 / IPv6</td>
<td class="label">Network Address</td> <td class="label">Network Address</td>
<td class="label">Mask bits</td> <td class="label">Mask bits</td>
</tr> </tr>
<tr> <tr>
<td> <td><input type="text" name="network" size="15" maxlength="15" value="192.168.0.0"></td>
<input type="radio" name="version" value="4" checked /> <td>/<input type="text" name="netbits" size="2" maxlength="2" value="16"></td>
<input type="radio" name="version" value="6" /> <td><input type="submit" value="Update">
</td>
<td><input type="text" name="network" size="15" maxlength="45" value="192.168.0.0"></td>
<td>/<input type="text" name="netbits" size="3" maxlength="3" value="16"></td>
<td><input type="submit" value="Update" />
<input type="button" value="Reset" onclick="if (confirm('This will reset all subnet divisions you have made. Proceed?')) startOver();"> <input type="button" value="Reset" onclick="if (confirm('This will reset all subnet divisions you have made. Proceed?')) startOver();">
</td> </td>
</tr> </tr>