/** * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2016 * @license Apache-2.0 */ import Operation from "../Operation"; import OperationError from "../errors/OperationError"; import Utils from "../Utils"; import {fromHex} from "../lib/Hex"; /** * Change IP format operation */ class ChangeIPFormat extends Operation { /** * ChangeIPFormat constructor */ constructor() { super(); this.name = "Change IP format"; this.module = "Default"; this.description = "Convert an IP address from one format to another, e.g. 172.20.23.54 to ac141736"; this.inputType = "string"; this.outputType = "string"; this.args = [ { "name": "Input format", "type": "option", "value": ["Dotted Decimal", "Decimal", "Hex"] }, { "name": "Output format", "type": "option", "value": ["Dotted Decimal", "Decimal", "Hex"] } ]; } /** * @param {string} input * @param {Object[]} args * @returns {string} */ run(input, args) { const [inFormat, outFormat] = args, lines = input.split("\n"); let output = "", j = 0; for (let i = 0; i < lines.length; i++) { if (lines[i] === "") continue; let baIp = []; let octets; let decimal; if (inFormat === outFormat) { output += lines[i] + "\n"; continue; } // Convert to byte array IP from input format switch (inFormat) { case "Dotted Decimal": octets = lines[i].split("."); for (j = 0; j < octets.length; j++) { baIp.push(parseInt(octets[j], 10)); } break; case "Decimal": decimal = lines[i].toString(); baIp.push(decimal >> 24 & 255); baIp.push(decimal >> 16 & 255); baIp.push(decimal >> 8 & 255); baIp.push(decimal & 255); break; case "Hex": baIp = fromHex(lines[i]); break; default: throw new OperationError("Unsupported input IP format"); } let ddIp; let decIp; let hexIp; // Convert byte array IP to output format switch (outFormat) { case "Dotted Decimal": ddIp = ""; for (j = 0; j < baIp.length; j++) { ddIp += baIp[j] + "."; } output += ddIp.slice(0, ddIp.length-1) + "\n"; break; case "Decimal": decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; output += decIp.toString() + "\n"; break; case "Hex": hexIp = ""; for (j = 0; j < baIp.length; j++) { hexIp += Utils.hex(baIp[j]); } output += hexIp + "\n"; break; default: throw new OperationError("Unsupported output IP format"); } } return output.slice(0, output.length-1); } } export default ChangeIPFormat;