diff --git a/src/tools/index.ts b/src/tools/index.ts index aa861c93..a0d5ba17 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -6,6 +6,7 @@ import { tool as asciiTextDrawer } from './ascii-text-drawer'; import { tool as textToUnicode } from './text-to-unicode'; import { tool as safelinkDecoder } from './safelink-decoder'; +import { tool as option43Generator } from './option43-generator'; import { tool as pdfSignatureChecker } from './pdf-signature-checker'; import { tool as numeronymGenerator } from './numeronym-generator'; import { tool as macAddressGenerator } from './mac-address-generator'; @@ -152,7 +153,15 @@ export const toolsByCategory: ToolCategory[] = [ }, { name: 'Network', - components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator], + components: [ + ipv4SubnetCalculator, + ipv4AddressConverter, + ipv4RangeExpander, + macAddressLookup, + macAddressGenerator, + ipv6UlaGenerator, + option43Generator, + ], }, { name: 'Math', diff --git a/src/tools/option43-generator/index.ts b/src/tools/option43-generator/index.ts new file mode 100644 index 00000000..708a204b --- /dev/null +++ b/src/tools/option43-generator/index.ts @@ -0,0 +1,12 @@ +import { RouterOutlined } from '@vicons/material'; +import { defineTool } from '../tool'; + +export const tool = defineTool({ + name: 'Option43 generator', + path: '/option43-generator', + description: 'Generate Option43 Wifi DHCP configuration', + keywords: ['option43', 'wifi', 'dhcp', 'generator'], + component: () => import('./option43-generator.vue'), + icon: RouterOutlined, + createdAt: new Date('2024-03-09'), +}); diff --git a/src/tools/option43-generator/option43-generator.service.test.ts b/src/tools/option43-generator/option43-generator.service.test.ts new file mode 100644 index 00000000..722d41ce --- /dev/null +++ b/src/tools/option43-generator/option43-generator.service.test.ts @@ -0,0 +1,5 @@ +// import { } from './option43-generator.service'; +// +// describe('option43-generator', () => { +// +// }) diff --git a/src/tools/option43-generator/option43-generator.service.ts b/src/tools/option43-generator/option43-generator.service.ts new file mode 100644 index 00000000..3ab92fc6 --- /dev/null +++ b/src/tools/option43-generator/option43-generator.service.ts @@ -0,0 +1,237 @@ +// from option43.org + +function IPToHexDigit(ip_addr: string) { // Ruckus + const arr1 = []; + // ip_addr = ip_addr.split('.').join(''); + for (let n = 0, l = ip_addr.length; n < l; n++) { + const hex = Number(ip_addr.charCodeAt(n)).toString(16); + arr1.push(hex); + } + return arr1.join(''); +} + +function IPToHexNumber(ip_addr: string) { + const arr1 = []; + const ips = ip_addr.split('.'); + for (let n = 0, l = ips.length; n < l; n++) { + const hex = (`0${Number(ips[n]).toString(16)}`).slice(-2); + arr1.push(hex); + } + return arr1.join(''); +} + +function IPCharCounter(ip_addr: string, ret: string) { + if (ret === 'hex') { + return (`0${ip_addr.length.toString(16)}`).slice(-2); + } + else { + return ip_addr.length; + } +} + +function splitIPs(ip_addr: string) { + const validIPs = []; + const rows = ip_addr.split('\n'); + for (let n = 0, l = rows.length; n < l; n++) { + if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(rows[n])) { + validIPs.push(rows[n]); + } + } + return validIPs; +} + +function IPNumberCounter(ip_addr: string[]) { + return ip_addr.length; +} + +function renderSettings( + dhcp_vendor: string, + option43_type: string, + option43_subtype: string, + option43_value: string, + option60_type: string | undefined, + option60_value: string | undefined, + vendor_link: string | undefined, + diff_number: number | undefined) { + let output; + switch (dhcp_vendor) { + case 'cisco_01': + // option code [instance number] {ascii string | hex string | ip-address} // no quotation marks in option 43! + output = '
Cisco CLI commands:
option '; + if (typeof diff_number !== 'undefined') { + output = output + diff_number; + } + else { output = `${output}43`; } + output = `${output} ${option43_type}`; + output = `${output} ${option43_subtype}${option43_value}`; + if (typeof option60_value !== 'undefined') { + output = `${output}
option 60 ascii "${option60_value}"`; + } + output = `${output}
Juniper EX CLI commands:
set system services dhcp option '; + if (typeof diff_number !== 'undefined') { + output = output + diff_number; + } + else { output = `${output}43`; } + if (option43_type === 'ascii') { + option43_type = 'string'; + } + if (option60_type === 'ascii') { + option60_type = 'string'; + } + output = `${output} ${option43_type}`; + output = `${output} ${option43_subtype}${option43_value}`; + if (typeof option60_value !== 'undefined') { + output = `${output}
set system services dhcp option 60 ascii "${option60_value}"`; + } + output = `${output}
Juniper SRX CLI commands:
set access address-assignment pool AP_DHCP_POOL family inet dhcp-attributes option '; + if (typeof diff_number !== 'undefined') { + output = output + diff_number; + } + else { output = `${output}43`; } + if (option43_type === 'ascii') { + option43_type = 'string'; + } + if (option43_type === 'hex') { + option43_type = 'byte-stream'; + } + output = `${output} ${option43_type}`; + if (option43_type === 'byte-stream') { + output = `${output} "0x${(option43_subtype + option43_value).match(/.{1,2}/g)?.join(' 0x')}"`; + } + else { + output = `${output} ${option43_subtype}${option43_value}`; + } + if (option60_type === 'ascii') { + option60_type = 'string'; + } + if (typeof option60_value !== 'undefined') { + output = `${output}
set access address-assignment pool AP_DHCP_POOL family inet dhcp-attributes option 60 ascii "${option60_value}"`; + } + output = `${output}
Raw values:
Option ';
+ if (typeof diff_number !== 'undefined') {
+ output = output + diff_number;
+ }
+ else {
+ output = `${output}43`;
+ }
+ output = `${output}
Type: "`;
+ if (option43_type === 'ascii') {
+ option43_type = 'String/ASCII';
+ }
+ if (option43_type === 'hex') {
+ option43_type = 'Hexadecimal';
+ }
+ if (option43_type === 'ip') {
+ option43_type = 'IP-Address';
+ }
+ if (option60_type === 'ascii') {
+ option60_type = 'String/ASCII';
+ }
+ output = output + option43_type;
+ output = `${output}"
Value: ${option43_subtype}${option43_value}`;
+ if (typeof option60_value !== 'undefined') {
+ output = `${output}
Option 60
Type: "${option60_type}"
Value: "${option60_value}"`;
+ }
+ output = `${output}