From 1cdf18747db4fa5e0e20c351896545dff31ea103 Mon Sep 17 00:00:00 2001 From: Tilen Komel Date: Wed, 7 Aug 2024 08:35:16 +0200 Subject: [PATCH 1/6] Added ip utils --- src/core/utils/ip.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/core/utils/ip.ts diff --git a/src/core/utils/ip.ts b/src/core/utils/ip.ts new file mode 100644 index 00000000..09f7c935 --- /dev/null +++ b/src/core/utils/ip.ts @@ -0,0 +1,13 @@ +export function convertIntToIpAddress(int: number): string { + return `${int & 0xff}.${(int >> 8) & 0xff}.${(int >> 16) & 0xff}.${(int >> 24) & 0xff}`; +} + +export function convertIpAddressToInt(ip: string): number | null { + const parts = ip.split('.').map(Number).reverse(); // little-endian byte order + + if (parts.some(Number.isNaN)) { + return null; + } + + return parts.reduce((total, part) => (total << 8) | part, 0); +} \ No newline at end of file From ebd5a3d3a6a82fdc8c92f5840793beccf5240cad Mon Sep 17 00:00:00 2001 From: Tilen Komel Date: Wed, 7 Aug 2024 08:36:32 +0200 Subject: [PATCH 2/6] Implemented IP utils --- .../PageComponents/Config/Network.tsx | 26 +++++++++++++++++-- src/validation/config/network.ts | 8 +++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/components/PageComponents/Config/Network.tsx b/src/components/PageComponents/Config/Network.tsx index 1b31db59..df6bd78e 100644 --- a/src/components/PageComponents/Config/Network.tsx +++ b/src/components/PageComponents/Config/Network.tsx @@ -2,10 +2,27 @@ import type { NetworkValidation } from "@app/validation/config/network.js"; import { DynamicForm } from "@components/Form/DynamicForm.js"; import { useDevice } from "@core/stores/deviceStore.js"; import { Protobuf } from "@meshtastic/js"; +import { convertIntToIpAddress, convertIpAddressToInt } from "@core/utils/ip.js"; export const Network = (): JSX.Element => { const { config, setWorkingConfig } = useDevice(); + const netConfig = { + wifiEnabled: config.network?.wifiEnabled, + wifiSsid: config.network?.wifiSsid, + wifiPsk: config.network?.wifiPsk, + ethEnabled: config.network?.ethEnabled, + addressMode: config.network?.addressMode, + ipv4Config: { + ip: convertIntToIpAddress(config.network?.ipv4Config?.ip ?? 0), + gateway: convertIntToIpAddress(config.network?.ipv4Config?.gateway ?? 0), + subnet: convertIntToIpAddress(config.network?.ipv4Config?.subnet ?? 0), + dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0), + }, + ntpServer: config.network?.ntpServer, + rsyslogServer: config.network?.rsyslogServer, + } + const onSubmit = (data: NetworkValidation) => { setWorkingConfig( new Protobuf.Config.Config({ @@ -14,7 +31,12 @@ export const Network = (): JSX.Element => { value: { ...data, ipv4Config: new Protobuf.Config.Config_NetworkConfig_IpV4Config( - data.ipv4Config, + { + ip: convertIpAddressToInt(data.ipv4Config.ip) ?? 0, + gateway: convertIpAddressToInt(data.ipv4Config.gateway) ?? 0, + subnet: convertIpAddressToInt(data.ipv4Config.subnet) ?? 0, + dns: convertIpAddressToInt(data.ipv4Config.dns) ?? 0, + }, ), }, }, @@ -25,7 +47,7 @@ export const Network = (): JSX.Element => { return ( onSubmit={onSubmit} - defaultValues={config.network} + defaultValues={netConfig} fieldGroups={[ { label: "WiFi Config", diff --git a/src/validation/config/network.ts b/src/validation/config/network.ts index 8f851d69..65953aae 100644 --- a/src/validation/config/network.ts +++ b/src/validation/config/network.ts @@ -45,17 +45,17 @@ export class NetworkValidationIpV4Config { @IsIP() @IsOptional() - ip: number; + ip: string; @IsIP() @IsOptional() - gateway: number; + gateway: string; @IsIP() @IsOptional() - subnet: number; + subnet: string; @IsIP() @IsOptional() - dns: number; + dns: string; } From 8ed3ce820342eed5fab7f70b35f10d72a489447a Mon Sep 17 00:00:00 2001 From: Tilen Komel Date: Wed, 21 Aug 2024 23:13:35 +0200 Subject: [PATCH 3/6] Error & Format fixing --- .../PageComponents/Config/Network.tsx | 21 ++++++++++--------- src/core/utils/ip.ts | 6 +++--- src/validation/config/network.ts | 5 ++++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/components/PageComponents/Config/Network.tsx b/src/components/PageComponents/Config/Network.tsx index df6bd78e..564f22a3 100644 --- a/src/components/PageComponents/Config/Network.tsx +++ b/src/components/PageComponents/Config/Network.tsx @@ -1,8 +1,11 @@ import type { NetworkValidation } from "@app/validation/config/network.js"; import { DynamicForm } from "@components/Form/DynamicForm.js"; import { useDevice } from "@core/stores/deviceStore.js"; +import { + convertIntToIpAddress, + convertIpAddressToInt, +} from "@core/utils/ip.js"; import { Protobuf } from "@meshtastic/js"; -import { convertIntToIpAddress, convertIpAddressToInt } from "@core/utils/ip.js"; export const Network = (): JSX.Element => { const { config, setWorkingConfig } = useDevice(); @@ -21,7 +24,7 @@ export const Network = (): JSX.Element => { }, ntpServer: config.network?.ntpServer, rsyslogServer: config.network?.rsyslogServer, - } + }; const onSubmit = (data: NetworkValidation) => { setWorkingConfig( @@ -30,14 +33,12 @@ export const Network = (): JSX.Element => { case: "network", value: { ...data, - ipv4Config: new Protobuf.Config.Config_NetworkConfig_IpV4Config( - { - ip: convertIpAddressToInt(data.ipv4Config.ip) ?? 0, - gateway: convertIpAddressToInt(data.ipv4Config.gateway) ?? 0, - subnet: convertIpAddressToInt(data.ipv4Config.subnet) ?? 0, - dns: convertIpAddressToInt(data.ipv4Config.dns) ?? 0, - }, - ), + ipv4Config: new Protobuf.Config.Config_NetworkConfig_IpV4Config({ + ip: convertIpAddressToInt(data.ipv4Config.ip) ?? 0, + gateway: convertIpAddressToInt(data.ipv4Config.gateway) ?? 0, + subnet: convertIpAddressToInt(data.ipv4Config.subnet) ?? 0, + dns: convertIpAddressToInt(data.ipv4Config.dns) ?? 0, + }), }, }, }), diff --git a/src/core/utils/ip.ts b/src/core/utils/ip.ts index 09f7c935..3fcc9686 100644 --- a/src/core/utils/ip.ts +++ b/src/core/utils/ip.ts @@ -3,11 +3,11 @@ export function convertIntToIpAddress(int: number): string { } export function convertIpAddressToInt(ip: string): number | null { - const parts = ip.split('.').map(Number).reverse(); // little-endian byte order + const parts = ip.split(".").map(Number).reverse(); // little-endian byte order if (parts.some(Number.isNaN)) { - return null; + return null; } return parts.reduce((total, part) => (total << 8) | part, 0); -} \ No newline at end of file +} diff --git a/src/validation/config/network.ts b/src/validation/config/network.ts index 65953aae..41db88d7 100644 --- a/src/validation/config/network.ts +++ b/src/validation/config/network.ts @@ -41,7 +41,10 @@ export class NetworkValidation export class NetworkValidationIpV4Config implements - Omit + Omit< + Protobuf.Config.Config_NetworkConfig_IpV4Config, + keyof Message | "ip" | "gateway" | "subnet" | "dns" + > { @IsIP() @IsOptional() From 2f2c777c56eee747722aa466d45a63de63072840 Mon Sep 17 00:00:00 2001 From: Tilen Komel Date: Tue, 17 Sep 2024 07:32:12 +0200 Subject: [PATCH 4/6] Optimize --- .../PageComponents/Config/Network.tsx | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/components/PageComponents/Config/Network.tsx b/src/components/PageComponents/Config/Network.tsx index 564f22a3..00426104 100644 --- a/src/components/PageComponents/Config/Network.tsx +++ b/src/components/PageComponents/Config/Network.tsx @@ -10,22 +10,6 @@ import { Protobuf } from "@meshtastic/js"; export const Network = (): JSX.Element => { const { config, setWorkingConfig } = useDevice(); - const netConfig = { - wifiEnabled: config.network?.wifiEnabled, - wifiSsid: config.network?.wifiSsid, - wifiPsk: config.network?.wifiPsk, - ethEnabled: config.network?.ethEnabled, - addressMode: config.network?.addressMode, - ipv4Config: { - ip: convertIntToIpAddress(config.network?.ipv4Config?.ip ?? 0), - gateway: convertIntToIpAddress(config.network?.ipv4Config?.gateway ?? 0), - subnet: convertIntToIpAddress(config.network?.ipv4Config?.subnet ?? 0), - dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0), - }, - ntpServer: config.network?.ntpServer, - rsyslogServer: config.network?.rsyslogServer, - }; - const onSubmit = (data: NetworkValidation) => { setWorkingConfig( new Protobuf.Config.Config({ @@ -48,7 +32,19 @@ export const Network = (): JSX.Element => { return ( onSubmit={onSubmit} - defaultValues={netConfig} + defaultValues={{ + ...config.network, + ipv4Config: { + ip: convertIntToIpAddress(config.network?.ipv4Config?.ip ?? 0), + gateway: convertIntToIpAddress( + config.network?.ipv4Config?.gateway ?? 0, + ), + subnet: convertIntToIpAddress( + config.network?.ipv4Config?.subnet ?? 0, + ), + dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0), + }, + }} fieldGroups={[ { label: "WiFi Config", From 3ee7a57480dd63b2de3a34f02351928e3dce82fc Mon Sep 17 00:00:00 2001 From: Hunter Thornsberry Date: Tue, 17 Sep 2024 12:35:51 -0400 Subject: [PATCH 5/6] rewrite convertIpAddressToInt --- src/core/utils/ip.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/core/utils/ip.ts b/src/core/utils/ip.ts index 3fcc9686..8d9ba849 100644 --- a/src/core/utils/ip.ts +++ b/src/core/utils/ip.ts @@ -3,11 +3,5 @@ export function convertIntToIpAddress(int: number): string { } export function convertIpAddressToInt(ip: string): number | null { - const parts = ip.split(".").map(Number).reverse(); // little-endian byte order - - if (parts.some(Number.isNaN)) { - return null; - } - - return parts.reduce((total, part) => (total << 8) | part, 0); + return ip.split('.').reverse().reduce((ipnum, octet) => { return (ipnum<<8) + parseInt(octet)}, 0) >>> 0; } From a8ee273b249b760d168b075595e75a855e4c6fa3 Mon Sep 17 00:00:00 2001 From: Hunter Thornsberry Date: Tue, 17 Sep 2024 12:36:49 -0400 Subject: [PATCH 6/6] biome --- src/core/utils/ip.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/utils/ip.ts b/src/core/utils/ip.ts index 8d9ba849..27d7aa9e 100644 --- a/src/core/utils/ip.ts +++ b/src/core/utils/ip.ts @@ -3,5 +3,12 @@ export function convertIntToIpAddress(int: number): string { } export function convertIpAddressToInt(ip: string): number | null { - return ip.split('.').reverse().reduce((ipnum, octet) => { return (ipnum<<8) + parseInt(octet)}, 0) >>> 0; + return ( + ip + .split(".") + .reverse() + .reduce((ipnum, octet) => { + return (ipnum << 8) + Number.parseInt(octet); + }, 0) >>> 0 + ); }