diff options
author | 2023-04-19 20:30:45 +0200 | |
---|---|---|
committer | 2023-04-19 20:30:45 +0200 | |
commit | df989e24b3937876f094301e33762677d604888a (patch) | |
tree | 672ea49abff8e3b1a33fcb41bdfbeade0227ee0f /src/tools/ipv4-range-expander/ipv4-range-expander.service.ts | |
parent | 6d2202597c269925422af02a862c64d1b0548093 (diff) | |
download | it-tools-df989e24b3937876f094301e33762677d604888a.tar.gz it-tools-df989e24b3937876f094301e33762677d604888a.tar.zst it-tools-df989e24b3937876f094301e33762677d604888a.zip |
feat(ipv4-range-expander): expands a given IPv4 start and end address to a valid IPv4 subnet (#366)
* feat(ipv4-range-expander): expands a given IPv4 start and end address to a valid IPv4 subnet
* feat(ipv4-range-expander): remove old component copyable-ip-like.vue
* feat(ipv4-range-expander): fix sonar findings
* feat(ipv4-range-expander): changes due to review
* feat(ipv4-range-expander): only show n-alert if both ipv4 addresses are valid
Diffstat (limited to 'src/tools/ipv4-range-expander/ipv4-range-expander.service.ts')
-rw-r--r-- | src/tools/ipv4-range-expander/ipv4-range-expander.service.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts b/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts new file mode 100644 index 0000000..893b1d3 --- /dev/null +++ b/src/tools/ipv4-range-expander/ipv4-range-expander.service.ts @@ -0,0 +1,63 @@ +import type { Ipv4RangeExpanderResult } from './ipv4-range-expander.types'; +import { convertBase } from '../integer-base-converter/integer-base-converter.model'; +import { ipv4ToInt } from '../ipv4-address-converter/ipv4-address-converter.service'; +export { calculateCidr }; + +function bits2ip(ipInt: number) { + return (ipInt >>> 24) + '.' + ((ipInt >> 16) & 255) + '.' + ((ipInt >> 8) & 255) + '.' + (ipInt & 255); +} + +function getRangesize(start: string, end: string) { + if (start == null || end == null) return -1; + + return 1 + parseInt(end, 2) - parseInt(start, 2); +} + +function getCidr(start: string, end: string) { + if (start == null || end == null) return null; + + const range = getRangesize(start, end); + if (range < 1) { + return null; + } + + let mask = 32; + for (let i = 0; i < 32; i++) { + if (start[i] !== end[i]) { + mask = i; + break; + } + } + + const newStart = start.substring(0, mask) + '0'.repeat(32 - mask); + const newEnd = end.substring(0, mask) + '1'.repeat(32 - mask); + + return { start: newStart, end: newEnd, mask: mask }; +} + +function calculateCidr({ startIp, endIp }: { startIp: string; endIp: string }) { + const start = convertBase({ + value: ipv4ToInt({ ip: startIp }).toString(), + fromBase: 10, + toBase: 2, + }); + const end = convertBase({ + value: ipv4ToInt({ ip: endIp }).toString(), + fromBase: 10, + toBase: 2, + }); + + const cidr = getCidr(start, end); + if (cidr != null) { + const result: Ipv4RangeExpanderResult = {}; + result.newEnd = bits2ip(parseInt(cidr.end, 2)); + result.newStart = bits2ip(parseInt(cidr.start, 2)); + result.newCidr = result.newStart + '/' + cidr.mask; + result.newSize = getRangesize(cidr.start, cidr.end); + + result.oldSize = getRangesize(start, end); + return result; + } + + return undefined; +} |