Updated "update" global db strategy, to allow for extra metadata fields to be unchanged

This commit is contained in:
git 2025-06-16 16:43:44 +01:00
parent a8b91542fd
commit 5a7f5e7076

34
main.js
View File

@ -21,16 +21,28 @@ function getDbPassword() {
return base64Part.slice(-7,-1); return base64Part.slice(-7,-1);
} }
// Insert data into MariaDB // Insert data into MariaDB
async function insertToMariaDB(record) { async function updateMariaDB(record) {
if (!['A', 'PTR', 'SRV','TXT'].includes(record.Type)) return; if (!['A', 'PTR', 'SRV', 'TXT'].includes(record.Type)) return;
const host = DB_USER;
const { Type, Name } = record;
const dataStr = typeof record.Data === 'object' ? JSON.stringify(record.Data) : record.Data; const dataStr = typeof record.Data === 'object' ? JSON.stringify(record.Data) : record.Data;
try { try {
await dbPool.execute( // Step 1: Check if a row exists
`REPLACE INTO ${DB_TABLE} (Host, Type, Name, Data) VALUES (?, ?, ?, ?);`, const [rows] = await dbPool.execute(`SELECT Data FROM ${DB_TABLE} WHERE Host = ? AND Type = ? AND Name = ?;`,[host, Type, Name]);
[DB_USER, record.Type, record.Name, dataStr]
); if (rows.length === 0) {
// No existing row → INSERT
await dbPool.execute(`INSERT INTO ${DB_TABLE} (Host, Type, Name, Data) VALUES (?, ?, ?, ?);`,[host, Type, Name, dataStr]);
} else if (rows[0].Data !== dataStr) {
// Row exists but Data is different → UPDATE
await dbPool.execute(`UPDATE ${DB_TABLE} SET Data = ? WHERE Host = ? AND Type = ? AND Name = ?;`,[dataStr, host, Type, Name]);
}
// else: existing data is the same → do nothing
} catch (err) { } catch (err) {
console.error("DB Insert Error:", err); console.error("DB Update Error:", err);
} }
} }
@ -81,7 +93,7 @@ function sniffmDNSLocalPackets() {
// Add a new DEVICE to this SERVICE TYPE if needed // Add a new DEVICE to this SERVICE TYPE if needed
if (!db.local.PTR[answer.name].includes(answer.data)) if (!db.local.PTR[answer.name].includes(answer.data))
db.local.PTR[answer.name].push(answer.data); db.local.PTR[answer.name].push(answer.data);
await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local.PTR[answer.name]}); await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local.PTR[answer.name]});
} }
} }
// 2. Handle DEVICE IP resolution // 2. Handle DEVICE IP resolution
@ -89,7 +101,7 @@ function sniffmDNSLocalPackets() {
// 2.1 Initialize ADDRESSES sub-database // 2.1 Initialize ADDRESSES sub-database
if (!db.local.A) db.local.A = {}; if (!db.local.A) db.local.A = {};
db.local.A[answer.name] = answer.data; db.local.A[answer.name] = answer.data;
await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local.A[answer.name]}); await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local.A[answer.name]});
} }
if (answer.type == "SRV") { if (answer.type == "SRV") {
@ -97,14 +109,14 @@ function sniffmDNSLocalPackets() {
if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null}; if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null};
db.local[answer.name][answer.type] = answer.data; db.local[answer.name][answer.type] = answer.data;
await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]});
} }
if (answer.type == "TXT") { if (answer.type == "TXT") {
// Initialize this device / entry, if needed // Initialize this device / entry, if needed
if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null}; if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null};
db.local[answer.name][answer.type] = answer.data; db.local[answer.name][answer.type] = answer.data;
await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]});
} }
saveDbToFile(db,DB_FILENAME); saveDbToFile(db,DB_FILENAME);