-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab01.main.js
78 lines (70 loc) · 2.9 KB
/
lab01.main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
Import the ip-cidr npm package.
See https://www.npmjs.com/package/ip-cidr
The ip-cidr package exports a class.
Assign the class definition to variable IPCIDR.
*/
const IPCIDR = require('ip-cidr');
/**
* Calculate and return the first host IP address from a CIDR subnet.
* @param {string} cidrStr - The IPv4 subnet expressed
* in CIDR format.
* @param {callback} callback - A callback function.
* @return {string} (firstIpAddress) - An IPv4 address.
*/
function getFirstIpAddress(cidrStr, callback) {
// Initialize return arguments for callback
let firstIpAddress = null;
let callbackError = null;
// Instantiate an object from the imported class and assign the instance to variable cidr.
const cidr = new IPCIDR(cidrStr);
// Initialize options for the toArray() method.
// We want an offset of one and a limit of one.
// This returns an array with a single element, the first host address from the subnet.
const options = {
from: 1,
limit: 1
};
// Use the object's isValid() method to verify the passed CIDR.
if (!cidr.isValid()) {
// If the passed CIDR is invalid, set an error message.
callbackError = 'Error: Invalid CIDR passed to getFirstIpAddress.';
} else {
// If the passed CIDR is valid, call the object's toArray() method.
// Notice the destructering assignment syntax to get the value of the first array's element.
[firstIpAddress] = cidr.toArray(options);
}
// Call the passed callback function.
// Node.js convention is to pass error data as the first argument to a callback.
// The IAP convention is to pass returned data as the first argument and error
// data as the second argument to the callback function.
return callback(firstIpAddress, callbackError);
}
/*
This section is used to test function and log any errors.
We will make several positive and negative tests.
*/
function main() {
// Create an array of tests with both valid CIDR and invalid IP subnets.
let sampleCidrs = ['172.16.10.0/24', '172.16.10.0 255.255.255.0', '172.16.10.128/25', '192.168.1.216/30'];
let sampleCidrsLen = sampleCidrs.length;
// Iterate over sampleCidrs and pass the element's value to getFirstIpAddress().
for (var i = 0; i < sampleCidrsLen; i++) {
console.log(`\n--- Test Number ${i + 1} getFirstIpAddress(${sampleCidrs[i]}) ---`);
// Call getFirstIpAddress and pass the test subnet and an anonymous callback function.
// The callback is using the fat arrow operator: () => { }
getFirstIpAddress(sampleCidrs[i], (data, error) => {
// Now we are inside the callback function.
// Display the results on the console.
if (error) {
console.error(`Error returned from GET request: ${error}`);
} else {
console.log(`Response returned from GET request: ${data}`);
}
});
}
}
/*
Call main to run it.
*/
main();