diff --git a/aix.js b/aix.js new file mode 100644 index 0000000..ce5290d --- /dev/null +++ b/aix.js @@ -0,0 +1,95 @@ +"use strict"; + +const getSqlStatement = family => { + let sql = + "select NEXT_HOP, LOCAL_BINDING_INTERFACE from QSYS2.NETSTAT_ROUTE_INFO where ROUTE_TYPE='DFTROUTE' and NEXT_HOP!='*DIRECT'"; + + if (family === "v4") { + sql += " and CONNECTION_TYPE='IPV4'"; + } else { + sql += " and CONNECTION_TYPE='IPV6'"; + } + + return sql; +}; + +const getGatewayInformationAsync = async family => { + return new Promise((resolve, reject) => { + try { + const idbConnector = require("idb-connector"); + + const dbconn = new idbConnector.dbconn(); + dbconn.conn("*LOCAL"); + + const sql = getSqlStatement(family); + const stmt = new idbConnector.dbstmt(dbconn); + + stmt.exec(sql, async results => { + try { + stmt.close(); + dbconn.disconn(); + dbconn.close(); + } catch (err) { + reject(new Error("Unable to determine default gateway")); + return; + } + + if (results && results[0] && results[0].NEXT_HOP) { + resolve({ + gateway: results[0].NEXT_HOP, + interface: results[0].LOCAL_BINDING_INTERFACE || "" + }); + } else { + reject(new Error("Unable to determine default gateway")); + } + }); + } catch (err) { + reject(new Error("Unable to determine default gateway")); + return; + } + }); +}; + +const getGatewayInformationSync = family => { + let results; + try { + const idbConnector = require("idb-connector"); + + const dbconn = new idbConnector.dbconn(); + dbconn.conn("*LOCAL"); + + const sql = getSqlStatement(family); + const stmt = new idbConnector.dbstmt(dbconn); + + results = stmt.execSync(sql); + + stmt.close(); + dbconn.disconn(); + dbconn.close(); + } catch (err) { + throw new Error("Unable to determine default gateway"); + } + + if (results && results[0] && results[0].NEXT_HOP) { + return { + gateway: results[0].NEXT_HOP, + interface: results[0].LOCAL_BINDING_INTERFACE || "" + }; + } else { + throw new Error("Unable to determine default gateway"); + } +}; + +const promise = family => { + return getGatewayInformationAsync(family); +}; + +const sync = family => { + return getGatewayInformationSync(family); +}; + +module.exports.v4 = () => promise("v4"); +module.exports.v6 = () => promise("v6"); + +module.exports.v4.sync = () => sync("v4"); +module.exports.v6.sync = () => sync("v6"); diff --git a/index.js b/index.js index 76da2b4..fbe3503 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,8 @@ if ([ "linux", "openbsd", "sunos", - "win32" + "win32", + "aix" ].indexOf(platform) !== -1) { const families = require(`./${platform}`); module.exports.v4 = () => families.v4(); diff --git a/package.json b/package.json index 98c3f61..eb56039 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,9 @@ "execa": "^1.0.0", "ip-regex": "^2.1.0" }, + "optionalDependencies": { + "idb-connector": "^1.1.8" + }, "devDependencies": { "eslint": "^5.5.0", "eslint-config-silverwind": "^2.0.9", @@ -28,7 +31,8 @@ "linux", "openbsd", "sunos", - "win32" + "win32", + "aix" ], "files": [ "index.js", @@ -38,7 +42,8 @@ "linux.js", "openbsd.js", "sunos.js", - "win32.js" + "win32.js", + "aix.js" ], "keywords": [ "default gateway",