43 lines
1.0 KiB
JavaScript
43 lines
1.0 KiB
JavaScript
export function parse_ipv4(value) {
|
|
const D = parseInt(value.slice(0, 2), 16);
|
|
const C = parseInt(value.slice(2, 4), 16);
|
|
const B = parseInt(value.slice(4, 6), 16);
|
|
const A = parseInt(value.slice(6, 8), 16);
|
|
return `${A}.${B}.${C}.${D}`;
|
|
}
|
|
|
|
export function parse_socket_state(socket_state) {
|
|
const ss_lines = socket_state.split('\n').map(line => line.trim());
|
|
const fields = ss_lines[0].split(/\s+/);
|
|
const result = [];
|
|
|
|
const field_parsers = {
|
|
'st': (value => parseInt(value, 16)),
|
|
'local_address': parse_ipv4,
|
|
'rem_address': parse_ipv4,
|
|
};
|
|
|
|
for (const line of ss_lines.slice(1)) {
|
|
const values = line.split(/\s+/);
|
|
const v_iter = values[Symbol.iterator]();
|
|
const pending = {};
|
|
for (const column of fields.slice(0, -1)) {
|
|
pending[column] = v_iter.next().value;
|
|
}
|
|
pending[fields.at(-1)] = [...v_iter].join(' ');
|
|
|
|
for (const [name, parser] of Object.entries(field_parsers)) {
|
|
const local_value = pending[name];
|
|
if (local_value) {
|
|
pending[name] = parser(local_value);
|
|
}
|
|
}
|
|
|
|
result.push(pending);
|
|
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|