Skip to content

Added support for AIX platform (for issue #5) #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 15, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions aix.js
Original file line number Diff line number Diff line change
@@ -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 || ""
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the query return a actual null for LOCAL_BINDING_INTERFACE in the IPv6 case?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it‘s a system table, it might be null. That‘s why I put it like this, just in case.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but I want to know if the null in the docs transform to a actual JavaScript null value or maybe 'null' or other weird things.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, this is what you mean.
According to the source of idb-connector dbstmt.cc ist translates SQL_NULL_DATA to an actual null value
See dbstmt.cc lines 344-345

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for digging that out!

});
} 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");
3 changes: 2 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ if ([
"linux",
"openbsd",
"sunos",
"win32"
"win32",
"aix"
].indexOf(platform) !== -1) {
const families = require(`./${platform}`);
module.exports.v4 = () => families.v4();
Expand Down
9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -28,7 +31,8 @@
"linux",
"openbsd",
"sunos",
"win32"
"win32",
"aix"
],
"files": [
"index.js",
Expand All @@ -38,7 +42,8 @@
"linux.js",
"openbsd.js",
"sunos.js",
"win32.js"
"win32.js",
"aix.js"
],
"keywords": [
"default gateway",
Expand Down