mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-05-05 05:47:10 -04:00
feat(new tool): Option 43 DHCP Generator
Option 43 DHCP Generator Fix #907
This commit is contained in:
parent
d3b32cc14e
commit
18f4fa8906
5 changed files with 355 additions and 1 deletions
|
@ -6,6 +6,7 @@ import { tool as asciiTextDrawer } from './ascii-text-drawer';
|
||||||
|
|
||||||
import { tool as textToUnicode } from './text-to-unicode';
|
import { tool as textToUnicode } from './text-to-unicode';
|
||||||
import { tool as safelinkDecoder } from './safelink-decoder';
|
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 pdfSignatureChecker } from './pdf-signature-checker';
|
||||||
import { tool as numeronymGenerator } from './numeronym-generator';
|
import { tool as numeronymGenerator } from './numeronym-generator';
|
||||||
import { tool as macAddressGenerator } from './mac-address-generator';
|
import { tool as macAddressGenerator } from './mac-address-generator';
|
||||||
|
@ -152,7 +153,15 @@ export const toolsByCategory: ToolCategory[] = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Network',
|
name: 'Network',
|
||||||
components: [ipv4SubnetCalculator, ipv4AddressConverter, ipv4RangeExpander, macAddressLookup, macAddressGenerator, ipv6UlaGenerator],
|
components: [
|
||||||
|
ipv4SubnetCalculator,
|
||||||
|
ipv4AddressConverter,
|
||||||
|
ipv4RangeExpander,
|
||||||
|
macAddressLookup,
|
||||||
|
macAddressGenerator,
|
||||||
|
ipv6UlaGenerator,
|
||||||
|
option43Generator,
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Math',
|
name: 'Math',
|
||||||
|
|
12
src/tools/option43-generator/index.ts
Normal file
12
src/tools/option43-generator/index.ts
Normal file
|
@ -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'),
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
// import { } from './option43-generator.service';
|
||||||
|
//
|
||||||
|
// describe('option43-generator', () => {
|
||||||
|
//
|
||||||
|
// })
|
237
src/tools/option43-generator/option43-generator.service.ts
Normal file
237
src/tools/option43-generator/option43-generator.service.ts
Normal file
|
@ -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 = '<p>Cisco CLI commands:</p><div class="cli"><p>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}</p><p>option 60 ascii "${option60_value}"`;
|
||||||
|
}
|
||||||
|
output = `${output}</p></div><!--<p>More information: ${vendor_link}</p>-->`;
|
||||||
|
return output;
|
||||||
|
case 'juniper_01':
|
||||||
|
// https://www.juniper.net/documentation/en_US/junos/topics/topic-map/dhcp-serever-options.html#id-configure-user-defined-dhcp-options
|
||||||
|
|
||||||
|
output = '<p>Juniper EX CLI commands:</p><div class="cli"><p>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}</p><p>set system services dhcp option 60 ascii "${option60_value}"`;
|
||||||
|
}
|
||||||
|
output = `${output}</p></div>`;
|
||||||
|
return output;
|
||||||
|
case 'juniper_02':
|
||||||
|
// https://www.juniper.net/documentation/en_US/junos/topics/topic-map/dhcp-serever-options.html#id-configure-user-defined-dhcp-options
|
||||||
|
|
||||||
|
output = '<p>Juniper SRX CLI commands:</p><div class="cli"><p>set access address-assignment pool <i>AP_DHCP_POOL</i> 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}</p><p>set access address-assignment pool <i>AP_DHCP_POOL</i> family inet dhcp-attributes option 60 ascii "${option60_value}"`;
|
||||||
|
}
|
||||||
|
output = `${output}</p></div>`;
|
||||||
|
return output;
|
||||||
|
default:
|
||||||
|
output = '<p>Raw values:</p><p><b>Option ';
|
||||||
|
if (typeof diff_number !== 'undefined') {
|
||||||
|
output = output + diff_number;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
output = `${output}43`;
|
||||||
|
}
|
||||||
|
output = `${output}</b><br />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}"<br />Value: ${option43_subtype}${option43_value}`;
|
||||||
|
if (typeof option60_value !== 'undefined') {
|
||||||
|
output = `${output}</p><p><b>Option 60</b><br /> Type: "${option60_type}"<br />Value: "${option60_value}"`;
|
||||||
|
}
|
||||||
|
output = `${output}</p></div>`;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getOption43Infos(ip_addr: string, wifi_vendor: string, dhcp_vendor: string) {
|
||||||
|
const ip_addr_array = splitIPs(ip_addr);
|
||||||
|
const ip_addr_hexDigit = IPToHexDigit (ip_addr_array.join(',')); // Ruckus, comma separation
|
||||||
|
const ip_addr_hexNumber = IPToHexNumber (ip_addr_array.join('.')); // valid for Cisco, no separation
|
||||||
|
const ip_addr_hexNumber_first = IPToHexNumber (ip_addr_array[0]);
|
||||||
|
|
||||||
|
const num_ips = IPNumberCounter (ip_addr_array);
|
||||||
|
const num_ip_bytes = (`0${(num_ips * 4).toString(16)}`).slice(-2);
|
||||||
|
|
||||||
|
let option43_type = ''; // hex, ascii, ip
|
||||||
|
let option43_subtype = ''; // vendor prefix
|
||||||
|
let option43_value;
|
||||||
|
let diff_number;
|
||||||
|
let option60_type; // hex, ascii, ip
|
||||||
|
let option60_value;
|
||||||
|
let vendor_link;
|
||||||
|
|
||||||
|
switch (wifi_vendor) {
|
||||||
|
case 'cisco_01':
|
||||||
|
option43_type = 'hex';
|
||||||
|
option43_subtype = 'f1';
|
||||||
|
option43_value = num_ip_bytes + ip_addr_hexNumber;
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'ruckus_01':
|
||||||
|
option43_type = 'hex';
|
||||||
|
option43_subtype = '06';
|
||||||
|
option43_value = IPCharCounter (ip_addr_array.join(','), 'hex') + ip_addr_hexDigit;
|
||||||
|
option60_type = 'ascii';
|
||||||
|
option60_value = 'Ruckus CPE';
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'ruckus_02':
|
||||||
|
option43_type = 'hex';
|
||||||
|
option43_subtype = '03';
|
||||||
|
option43_value = IPCharCounter (ip_addr_array.join(','), 'hex') + ip_addr_hexDigit;
|
||||||
|
option60_type = 'ascii';
|
||||||
|
option60_value = 'Ruckus CPE';
|
||||||
|
vendor_link = 'https://docs.commscope.com/bundle/zd-10.2-userguide/page/GUID-D5CF7FE0-D73F-4B4B-95C8-08CAB5B235D5.html';
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'aruba_01':
|
||||||
|
option43_type = 'ip';
|
||||||
|
option43_value = ip_addr;
|
||||||
|
option60_type = 'ascii';
|
||||||
|
option60_value = 'ArubaAP';
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'fortinet_01':
|
||||||
|
option43_type = 'ip';
|
||||||
|
option43_value = ip_addr_array.join(' ');
|
||||||
|
// diff_number = 138;
|
||||||
|
// option60_type = "ascii";
|
||||||
|
// option60_value = "ArubaAP";
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'fortinet_02':
|
||||||
|
option43_type = 'ip';
|
||||||
|
option43_value = ip_addr_array.join(' ');
|
||||||
|
diff_number = 138;
|
||||||
|
// option60_type = "ascii";
|
||||||
|
// option60_value = "ArubaAP";
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'ubiquiti_01':
|
||||||
|
option43_type = 'hex';
|
||||||
|
option43_subtype = '01';
|
||||||
|
option43_value = `04${ip_addr_hexNumber_first}`;
|
||||||
|
// option60_type = "ascii";
|
||||||
|
// option60_value = "Ruckus CPE";
|
||||||
|
// vendor_link = "https://docs.commscope.com/bundle/zd-10.2-userguide/page/GUID-D5CF7FE0-D73F-4B4B-95C8-08CAB5B235D5.html";
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'cambium_01':
|
||||||
|
option43_type = 'ascii';
|
||||||
|
// option43_subtype = "01";
|
||||||
|
option43_value = `"https://${ip_addr[0]}"`;
|
||||||
|
// option60_type = "ascii";
|
||||||
|
// option60_value = "Ruckus CPE";
|
||||||
|
// vendor_link = "https://docs.commscope.com/bundle/zd-10.2-userguide/page/GUID-D5CF7FE0-D73F-4B4B-95C8-08CAB5B235D5.html";
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
case 'linux_01':
|
||||||
|
return `Linux:<br />Option 43 (IP-address): ${ip_addr}<br /> You also <b>need</b>:<br />Option 60 (String): "ArubaAP".`;
|
||||||
|
case 'netgear_01':
|
||||||
|
option43_type = 'hex';
|
||||||
|
option43_subtype = '0204';
|
||||||
|
option43_value = ip_addr_hexNumber_first;
|
||||||
|
return renderSettings(dhcp_vendor, option43_type, option43_subtype, option43_value, option60_type, option60_value, vendor_link, diff_number);
|
||||||
|
default:
|
||||||
|
return 'Not implemented';
|
||||||
|
}
|
||||||
|
};
|
91
src/tools/option43-generator/option43-generator.vue
Normal file
91
src/tools/option43-generator/option43-generator.vue
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useStorage } from '@vueuse/core';
|
||||||
|
import { getOption43Infos } from './option43-generator.service';
|
||||||
|
|
||||||
|
const dhcpVendorOptions = [
|
||||||
|
{ value: 'genuine', label: 'Native' },
|
||||||
|
{ value: 'cisco_01', label: 'Cisco IOS device' },
|
||||||
|
{ value: 'juniper_01', label: 'Juniper EX device' },
|
||||||
|
{ value: 'juniper_02', label: 'Juniper SRX device' },
|
||||||
|
{ value: 'linux_01', label: 'Linux DHCPD' },
|
||||||
|
{ value: 'ruckus_01', label: 'Ruckus SmartCellGateway' },
|
||||||
|
{ value: 'lancom_01', label: 'Lancom' },
|
||||||
|
{ value: 'fortinet_01', label: 'Fortinet' },
|
||||||
|
];
|
||||||
|
const wifiVendorOptions = [
|
||||||
|
{ value: 'cisco_01', label: 'Cisco Aironet' },
|
||||||
|
{ value: 'aruba_01', label: 'Aruba' },
|
||||||
|
{ value: 'ruckus_01', label: 'Ruckus SmartZone' },
|
||||||
|
{ value: 'ruckus_02', label: 'Ruckus ZoneDirector' },
|
||||||
|
{ value: 'ruckus_01', label: 'Ruckus SmartCellGateway' },
|
||||||
|
{ value: 'ubiquiti_01', label: 'Ubiquiti' },
|
||||||
|
{ value: 'fortinet_01', label: 'Fortinet (old)' },
|
||||||
|
{ value: 'fortinet_02', label: 'Fortinet (new/CAPWAP)' },
|
||||||
|
{ value: 'netgear_01', label: 'Netgear' },
|
||||||
|
{ value: 'cambium_01', label: 'Cambium cnMaestro' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const dhcpVendor = useStorage('option43-generator:dhcp', 'genuine');
|
||||||
|
const wifiVendor = useStorage('option43-generator:wifi', 'cisco_01');
|
||||||
|
const ipAdresses = ref('192.168.0.15');
|
||||||
|
|
||||||
|
const option43Infos = computed(() => getOption43Infos(ipAdresses.value, wifiVendor.value, dhcpVendor.value));
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div style="margin: 0 auto; max-width: 600px">
|
||||||
|
<c-card>
|
||||||
|
<c-select
|
||||||
|
v-model:value="wifiVendor"
|
||||||
|
label="Wifi Vendor:"
|
||||||
|
label-position="left"
|
||||||
|
label-width="120px"
|
||||||
|
label-align="right"
|
||||||
|
mb-2
|
||||||
|
:options="wifiVendorOptions"
|
||||||
|
w-full
|
||||||
|
placeholder="Select a Wifi Vendor"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<c-select
|
||||||
|
v-model:value="dhcpVendor"
|
||||||
|
label="DHCP Vendor:"
|
||||||
|
label-position="left"
|
||||||
|
label-width="120px"
|
||||||
|
label-align="right"
|
||||||
|
mb-2
|
||||||
|
:options="dhcpVendorOptions"
|
||||||
|
w-full
|
||||||
|
placeholder="Select a DHCP Vendor"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<c-input-text
|
||||||
|
v-model:value="ipAdresses"
|
||||||
|
label="IP Address(es) (one per line):"
|
||||||
|
label-position="left"
|
||||||
|
label-width="120px"
|
||||||
|
label-align="right"
|
||||||
|
multiline mb-2
|
||||||
|
placeholder="Enter your IP Addresses (one per line)"
|
||||||
|
/>
|
||||||
|
</c-card>
|
||||||
|
|
||||||
|
<c-card title="Option 43 Result">
|
||||||
|
<div v-html="option43Infos" />
|
||||||
|
</c-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
.highlight {
|
||||||
|
color: orange;
|
||||||
|
font-variant: small-caps;
|
||||||
|
}
|
||||||
|
.cli {
|
||||||
|
background-color: black;
|
||||||
|
color: #adfc03;
|
||||||
|
font-family: monospace;
|
||||||
|
padding: 10px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Add table
Add a link
Reference in a new issue