UNPKG

penguins-eggs

Version:

A remaster system tool, compatible with Almalinux, Alpine, Arch, Debian, Devuan, Fedora, Manjaro, Opensuse, Ubuntu and derivatives

401 lines (400 loc) 11 kB
import sprintf from '../sprintf.js'; /** * converters.js * * used by dhcpd-proxy */ import { readInt8, readInt16, readInt32, readIp, readString, writeBytes, writeInt8, writeInt16, writeInt32, writeIp, writeString } from '../utils.js'; /** * converters */ const converters = { // option 1: subnet mask 1: { decode: readIp, encode: writeIp }, // option 2: time offset 2: { decode: function decode(buf) { return readInt32(buf, 0); }, encode: function encode(buf, num, value, offset) { buf[offset++] = num; buf[offset++] = 4; writeInt32(buf, value, offset); return offset + 4; } }, // option 3: routers 3: { decode: function decode(buf) { let i; let numRecords; let pos; let records; numRecords = buf.length / 4; pos = 0; records = []; i = 0; while (i < numRecords) { records.push(sprintf('%d.%d.%d.%d', buf[pos++], buf[pos++], buf[pos++], buf[pos++])); i++; } return records; }, encode: function encode(buf, num, data, offset) { let routers; routers = data; buf[offset++] = num; buf[offset++] = routers.length * 4; routers.forEach((ip) => ip.split('.').forEach((item) => { buf[offset++] = item; })); return offset; } }, // option 6: dns servers 6: { decode(buf) { let i; let numRecords; let pos; let records; numRecords = buf.length / 4; pos = 0; records = []; i = 0; while (i < numRecords) { records.push(sprintf('%d.%d.%d.%d', buf[pos++], buf[pos++], buf[pos++], buf[pos++])); i++; } return records; }, encode(buf, num, data, offset) { let routers; routers = data.split(','); buf[offset++] = num; buf[offset++] = routers.length * 4; routers.forEach((ip) => ip.split('.').forEach((item) => { buf[offset++] = item; })); return offset; } }, /* // option 119: dns search list 119: { encode: null, decode: null }, */ // option 12: hostname 12: { decode: readString, encode: writeString }, // option 15: dns domain name 15: { decode: readString, encode: writeString }, // option 28: broadcast address 28: { decode: readIp, encode: writeIp }, // option 31: router discovery 31: { decode(buf) { return readInt8(buf, 0); }, encode(buf, num, value, offset) { buf[offset++] = num; buf[offset++] = 1; writeInt8(buf, value, offset); return offset + 1; } }, // option 33: static routes 33: { decode: function decode(buf) { let i; let numRecords; let pos; let records; numRecords = buf.length / 4; pos = 0; records = []; i = 0; while (i < numRecords) { records.push(sprintf('%d.%d.%d.%d', buf[pos++], buf[pos++], buf[pos++], buf[pos++])); i++; } return records; }, encode: function encode(buf, num, data, offset) { let routers; routers = data.split(','); buf[offset++] = num; buf[offset++] = routers.length * 4; routers.forEach((ip) => ip.split('.').forEach((item) => { buf[offset++] = item; })); return offset; } }, // option 43: vendor specific information 43: { decode(buf) { const records = []; let i = 0; const len = buf.length; while (i < len) { records.push(sprintf('%02x', buf[i])); i++; } return records.join(':'); }, encode(buf, num, data, offset) { const vendorinfo = data.split(':'); buf[offset++] = num; buf[offset++] = vendorinfo.length; vendorinfo.forEach((hex) => { buf[offset++] = Number.parseInt(hex, 16); }); return offset; } }, // option 44: netbios name servers 44: { decode(buf) { let i; let numRecords; let pos; let records; numRecords = buf.length / 4; pos = 0; records = []; i = 0; while (i < numRecords) { records.push(sprintf('%d.%d.%d.%d', buf[pos++], buf[pos++], buf[pos++], buf[pos++])); i++; } return records; }, encode(buf, num, data, offset) { let routers; routers = data.split(','); buf[offset++] = num; buf[offset++] = routers.length * 4; routers.forEach((ip) => ip.split('.').forEach((item) => { buf[offset++] = item; })); return offset; } }, // option 46: netbios node type 46: { decode(buf) { return Number.parseInt(buf[0], 16); }, encode(buf, num, value, offset) { buf[offset++] = num; buf[offset++] = 1; buf[offset++] = Number.parseInt(buf[0], 10).toString(16); return offset; } }, // option 47: netbios node type 47: { decode: readString, encode: writeString }, // option 50: requested ip address 50: { decode: readIp, encode: writeIp }, // option 51: lease time 51: { decode(buf) { return readInt32(buf, 0); }, encode(buf, num, value, offset) { buf[offset++] = num; buf[offset++] = 4; writeInt32(buf, value, offset); return offset + 4; } }, // option 53: message type 53: { decode(buf) { return Number.parseInt(buf[0], 10); }, encode(buf, num, value, offset) { buf[offset++] = 53; buf[offset++] = 1; buf[offset++] = value; return offset; } }, // option 54: server identifier 54: { decode: function decode(buf) { return readIp(buf, 0); }, encode: writeIp }, // option 55: parameter request list 55: { decode: function decode(buf) { const records = []; let i = 0; const len = buf.length; while (i < len) { records[i] = buf[i]; i++; } return records; }, encode: function encode(buf, num, data, offset) { buf[offset++] = num; buf[offset++] = data.length; writeBytes(buf, data, offset); // var i = 0; // while(i < data.length) { // utils.writeBytes(buf, data[i], offset); // i++; // offset++; // } return offset; } }, // option 57: max message size 57: { decode(buf) { return readInt16(buf, 0); }, encode(buf, num, value, offset) { buf[offset++] = 57; buf[offset++] = 2; writeInt16(buf, value, offset); return offset + 2; } }, // option 60: vendor class identifier 60: { decode: readString, encode: writeString }, // option 61: client identifier 61: { decode(buf) { let j; let s; let type; s = []; type = buf[0]; j = 1; while (j < buf.length) { s.push(sprintf('%02x', buf[j])); j++; } return [type, s.join(':')]; }, encode(buf, num, value, offset) { return offset; } }, // option 67: bootfile name 67: { decode: readString, encode: writeString }, // option 77: user class information 77: { decode(buf) { const records = []; let offset = 0; while (buf[offset]) { const uc_len = buf[offset]; const uc_data = buf.slice(offset++, uc_len); offset += uc_len; records.push(uc_data.toString('ascii')); } return records.join(':'); }, encode: writeString }, // option 83: client fqdn 83: { decode(buf) { let ret; ret = ''; ret += sprintf('%d', buf[0]) + '-'; ret += sprintf('%d', buf[1]) + '-'; ret += sprintf('%d', buf[2]) + ' '; // CHECK // ret += utils.toString(buf.slice(3)); ret += buf.slice(3).toString(); return ret; }, encode(buf, num, value, offset) { return offset; } }, // option 175: etherboot 175: { decode(buf) { let j; let s; s = []; j = 1; while (j < buf.length) { s.push(sprintf('%02x', buf[j])); j++; } return s.join(':'); }, encode(buf, num, value, offset) { return offset; } }, // option 255: end 255: { decode(buf) { }, encode(buf, num, value, offset) { writeInt8(buf, 255, offset); return offset + 1; } } }; const stub = { decode(buf, num) { // console.error("[dhcproxy] decoder for option " + num + " not found"); // console.log(" buffer:", buf); return null; }, encode(buf, num, value, offset) { // console.error("[dhcproxy] encoder for option " + num + " not found"); return offset; } }; export default function (i) { if (i == 67 || i == 66) { console.log('GET CONVERTER FOR ' + i); } return i in converters ? converters[i] : stub; } /** * error TS7053: Element implicitly has an 'any' type because expression * of type 'any' can't be used to index type: { '1': { encode: [Function: writeIp], decode: [Function: readIp] }, '2': { encode: [Function: encode], decode: [Function: decode] }, ... '255': { encode: [Function: encode], decode: [Function: decode] } } */