k2hr3-api
Version:
K2HR3 REST API is K2hdkc based Resource and Roles and policy Rules
355 lines (354 loc) • 15.7 kB
JavaScript
;
/*
* K2HR3 REST API
*
* Copyright 2017 Yahoo Japan Corporation.
*
* K2HR3 is K2hdkc based Resource and Roles and policy Rules, gathers
* common management information for the cloud.
* K2HR3 can dynamically manage information as "who", "what", "operate".
* These are stored as roles, resources, policies in K2hdkc, and the
* client system can dynamically read and modify these information.
*
* For the full copyright and license information, please view
* the license file that was distributed with this source code.
*
* AUTHOR: Takeshi Nakatani
* CREATE: Tue Oct 23 2018
* REVISION:
*
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ipwatch = exports.chkipconfig = void 0;
const util = __importStar(require("util"));
const dateformat_1 = __importDefault(require("dateformat"));
const k2hr3apiutil_1 = __importDefault(require("./k2hr3apiutil"));
const k2hr3dkc_1 = __importDefault(require("./k2hr3dkc"));
const dbglogging_1 = __importDefault(require("./dbglogging"));
const basicipcheck_1 = __importDefault(require("./basicipcheck"));
const k2hr3config_1 = require("./k2hr3config");
const apiConf = new k2hr3config_1.r3ApiConfig();
//---------------------------------------------------------
// Checking IP Addresses configuration
//---------------------------------------------------------
const localchkipconfig = {
type: k2hr3config_1.chkipType.CHECKER_TYPE_LISTENER, // Listener / Function / Basic{Or|And} / NoCheck
funcmod: null, // Module name(path) for Function type
pendingsec: 864000, // Limit for removing IP which is not alive : 10 * 24 * 60 * 60 = 10 days
intervalms: 4320000, // Interval ms for checking IP address : 12 * 60 * 60 * 1000 = 12 hour
parallelcnt: 32, // Parallel processing count
command4: 'ping', // Basic IP address check use this command for IPv4 : ping command
command6: 'ping6', // Basic IP address check use this command for IPv6
params: '-c 1', // Common ping command parameters
timeoutparam: '-W', // Timeout parameter name for ping command
timeoutms: 5000 // Timeout millisecond for each checking : 5000ms
};
(() => {
const chkipconfig = apiConf.getCheckIPConfig();
if (k2hr3apiutil_1.default.isSafeEntity(chkipconfig)) {
if (k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_LISTENER)) {
localchkipconfig.type = k2hr3config_1.chkipType.CHECKER_TYPE_LISTENER;
localchkipconfig.funcmod = null;
}
else if (k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_FUNCTION)) {
if (k2hr3apiutil_1.default.isSafeString(chkipconfig.funcmod)) {
localchkipconfig.type = k2hr3config_1.chkipType.CHECKER_TYPE_FUNCTION;
localchkipconfig.funcmod = chkipconfig.funcmod;
}
else {
dbglogging_1.default.elog('config : chkipconfig.funcmod value is something wrong : ' + JSON.stringify(chkipconfig.funcmod));
localchkipconfig.type = k2hr3config_1.chkipType.CHECKER_TYPE_NOCHECK;
localchkipconfig.funcmod = null;
}
}
else if (k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_OR) || k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_AND)) {
localchkipconfig.type = k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_OR) ? k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_OR : k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_AND;
localchkipconfig.funcmod = null;
if (k2hr3apiutil_1.default.isSafeString(chkipconfig.command4)) {
localchkipconfig.command4 = chkipconfig.command4;
}
if (k2hr3apiutil_1.default.isSafeString(chkipconfig.command6)) {
localchkipconfig.command6 = chkipconfig.command6;
}
if (k2hr3apiutil_1.default.isSafeString(chkipconfig.params)) {
localchkipconfig.params = chkipconfig.params;
}
if (k2hr3apiutil_1.default.isSafeString(chkipconfig.timeoutparam)) {
localchkipconfig.timeoutparam = chkipconfig.timeoutparam;
}
if (k2hr3apiutil_1.default.isSafeNumber(chkipconfig.timeoutms)) {
localchkipconfig.timeoutms = chkipconfig.timeoutms;
}
}
else if (k2hr3apiutil_1.default.compareCaseString(chkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_NOCHECK)) {
localchkipconfig.type = k2hr3config_1.chkipType.CHECKER_TYPE_NOCHECK;
localchkipconfig.funcmod = null;
}
else if (k2hr3apiutil_1.default.isSafeEntity(chkipconfig.type)) {
dbglogging_1.default.elog('config : chkipconfig.type value is something wrong : ' + JSON.stringify(chkipconfig.type));
localchkipconfig.type = k2hr3config_1.chkipType.CHECKER_TYPE_NOCHECK;
localchkipconfig.funcmod = null;
}
if (k2hr3apiutil_1.default.isSafeNumber(chkipconfig.pendingsec)) {
localchkipconfig.pendingsec = chkipconfig.pendingsec;
}
if (k2hr3apiutil_1.default.isSafeNumber(chkipconfig.intervalms)) {
localchkipconfig.intervalms = chkipconfig.intervalms;
}
if (k2hr3apiutil_1.default.isSafeNumber(chkipconfig.parallelcnt)) {
localchkipconfig.parallelcnt = chkipconfig.parallelcnt;
}
}
})();
//---------------------------------------------------------
// Utilities: Check configuration
//---------------------------------------------------------
const rawGetType = () => {
return localchkipconfig.type;
};
const rawIsListenerType = () => {
return k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_LISTENER);
};
const rawIsBasicType = () => {
return (k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_OR) || k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_AND));
};
const rawIsBasicOrType = () => {
return k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_OR);
};
const rawIsBasicAndType = () => {
return k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_BASIC_AND);
};
const rawIsFunctionType = () => {
return k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_FUNCTION);
};
const rawIsNocheckType = () => {
return k2hr3apiutil_1.default.compareCaseString(localchkipconfig.type, k2hr3config_1.chkipType.CHECKER_TYPE_NOCHECK);
};
//---------------------------------------------------------
// Watcher Logging
//---------------------------------------------------------
let loggingStream = null;
let loggingTimeForm = null;
(() => {
loggingStream = apiConf.getWatcherLoggingStream(__dirname + '/..');
loggingTimeForm = apiConf.getWatcherTimeFormat();
})();
const rawWatcherLogging = (...args) => {
const prefix = '[' + (0, dateformat_1.default)(new Date(), k2hr3apiutil_1.default.isString(loggingTimeForm) ? loggingTimeForm : undefined) + '] ';
if (k2hr3apiutil_1.default.isPlainObject(loggingStream)) {
loggingStream.write(prefix + util.format(...args) + '\n');
}
};
//---------------------------------------------------------
// Check Addresses Alive raw function
//---------------------------------------------------------
const rawWatchAddressesAliveEx = (ipchecker, callback) => {
if (!k2hr3apiutil_1.default.isSafeEntity(callback)) {
dbglogging_1.default.elog('callback is not function.');
return;
}
if (!k2hr3apiutil_1.default.isSafeEntity(ipchecker)) {
callback(true, new Error('ipchecker is not function')); // fatal
return;
}
//
// make ip addresses list depending cuk
//
const targetres = k2hr3dkc_1.default.getAllIpDatasByCuk(true); // Currently supports only openstack
if (k2hr3apiutil_1.default.isSafeEntity(targetres.error)) {
callback(false, new Error('failed getting IP addresses list depending cuk by ' + JSON.stringify(targetres.error)));
return;
}
if (!k2hr3apiutil_1.default.isNotEmptyArray(targetres.data)) {
callback(false, new Error('There is no IP address depending cuk'));
return;
}
//
// Check Addresses
//
ipchecker(targetres.data, localchkipconfig).then((res) => {
dbglogging_1.default.dlog('after checking IP addresses : ' + JSON.stringify(res));
if (k2hr3apiutil_1.default.isSafeEntity(res) && !k2hr3apiutil_1.default.isSafeEntity(res.error)) {
if (!k2hr3apiutil_1.default.isNotEmptyArray(res.data)) {
callback(false, new Error('There is no IP address depending cuk after checking, why...'));
return;
}
// remove/clear by result of checking
const result = k2hr3dkc_1.default.removeIpAddressWithCuk(res.data, localchkipconfig.pendingsec, rawWatcherLogging);
if (null !== result) {
callback(false, result);
}
else {
// Succeed without error
callback(false, null);
}
}
else {
let errmsg = 'unknown';
if (k2hr3apiutil_1.default.isPlainObject(res) && k2hr3apiutil_1.default.isPlainObject(res.error)) {
errmsg = k2hr3apiutil_1.default.isString(res.error.message) ? res.error.message : 'unknown';
}
callback(false, new Error('checking IP addresses returns error : ' + errmsg));
}
}).catch((error) => {
callback(true, new Error('checking IP addresses returns fatal error : ' + k2hr3apiutil_1.default.getSafeString(error.message))); // fatal
});
};
let local_mod = null;
(async () => {
if (rawIsFunctionType() && null !== localchkipconfig.funcmod) {
const mod = await k2hr3apiutil_1.default.tryLoadModule(localchkipconfig.funcmod);
if (k2hr3apiutil_1.default.isSafeEntity(mod)) {
local_mod = mod;
}
}
})();
const rawWatchAddressesAlive = (oneshotCB) => {
const _callback = oneshotCB;
//
// Load checkAddressesAlive function
//
let ipchecker = null;
try {
if (rawIsFunctionType() && null !== local_mod) {
ipchecker = local_mod.checkAddressesAlive;
}
else if (rawIsBasicType()) {
ipchecker = basicipcheck_1.default.checkAddressesAlive;
}
else {
// Nothing to do with interval
return null;
}
if (!k2hr3apiutil_1.default.isFunction(ipchecker)) {
dbglogging_1.default.elog('could not load checkAddressesAlive function in : ' + (rawIsBasicType() ? './basicipcheck' : localchkipconfig.funcmod));
return null;
}
}
catch (error) {
dbglogging_1.default.elog('could not load module : ' + (rawIsBasicType() ? './basicipcheck' : localchkipconfig.funcmod), JSON.stringify(error));
return null;
}
if (k2hr3apiutil_1.default.isFunction(_callback)) {
//
// one shot
//
rawWatchAddressesAliveEx(ipchecker, (is_fatal, error) => {
let result = true;
if (is_fatal) {
if (k2hr3apiutil_1.default.isPlainObject(error)) {
dbglogging_1.default.elog('Fatal error is occurred : ' + k2hr3apiutil_1.default.getSafeString(error.message));
}
else {
dbglogging_1.default.elog('Fatal error is occurred');
}
result = false;
}
else if (error) {
dbglogging_1.default.wlog('Finished with messsage : ' + error.message);
}
else {
dbglogging_1.default.dlog('Finished without any error messsage');
}
_callback(result);
});
return null;
}
//
// Set Interval
//
let isFatalError = false;
let isWorking = false;
const checkInterval = setInterval(() => {
if (!isFatalError && !isWorking) {
isWorking = true;
//
// Checking
//
rawWatchAddressesAliveEx(ipchecker, (is_fatal, error) => {
isWorking = false;
if (is_fatal) {
if (k2hr3apiutil_1.default.isPlainObject(error)) {
dbglogging_1.default.elog('Fatal error is occurred : ' + k2hr3apiutil_1.default.getSafeString(error.message));
}
else {
dbglogging_1.default.elog('Fatal error is occurred');
}
isFatalError = true;
}
else if (error) {
dbglogging_1.default.dlog('Finished with messsage : ' + error.message);
}
else {
dbglogging_1.default.dlog('Finished without messsage');
}
});
}
}, localchkipconfig.intervalms);
return checkInterval;
};
//---------------------------------------------------------
// Exports
//---------------------------------------------------------
//
// Variables
//
exports.chkipconfig = localchkipconfig;
//
// Functions
//
exports.ipwatch = {
getType: rawGetType,
isListenerType: rawIsListenerType,
isBasicType: rawIsBasicType,
isBasicOrType: rawIsBasicOrType,
isBasicAndType: rawIsBasicAndType,
isFunctionType: rawIsFunctionType,
isNocheckType: rawIsNocheckType,
watchAddressesAlive: rawWatchAddressesAlive
};
exports.default = exports.ipwatch;
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noexpandtab sw=4 ts=4 fdm=marker
* vim<600: noexpandtab sw=4 ts=4
*/