mainArp.js

//////////////////////////////////////////////////////////////////////
//	Copyright (C) Hiroshi SUGIMURA 2020.10.30
//////////////////////////////////////////////////////////////////////
/**
 * @module mainArp
 */
'use strict'

//////////////////////////////////////////////////////////////////////
// 基本ライブラリ
const Store = require('electron-store');
const arp = require('@network-utils/arp-lookup');
const cron = require('node-cron');
require('date-utils'); // for log
const { Sequelize, sqlite3, arpModel } = require('./models/localDBModels');   // DBデータと連携

const store = new Store();
let config = {
	enabled: true,  // 機能の有効化
	debug: false
};

let persist = {};


let sendIPCMessage = null;

//////////////////////////////////////////////////////////////////////
let mainArp = {
	isRun: false,  // 機能が利用可能になったか?
	table: null,
	observationJob: null,

	//////////////////////////////////////////////////////////////////////
	// 内部

	/**
	 * @func toMAC
	 * @desc IP address to MAC address
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	// arpテーブル検索,IPからMACアドレスに変換
	toMAC: function(IP) {  //  IP = '192.168.2.192'
		if( IP == '224.0.23.0' || IP == 'FF02::1' ) {
			return 'Multicast(EL)';
		}

		if( !mainArp.isRun || mainArp.table == undefined || mainArp.table == null ) {
			return 'unknown';
		}


		let foundRow = mainArp.table.find( (row) => {
			if( row.ip==IP ) {
				true;
			}
		} );

		if( foundRow == undefined ) {
			return 'unknown';
		}else{
			return foundRow.mac;
		}
	},


	//////////////////////////////////////////////////////////////////////
	// interfaces
	/**
	 * @func start
	 * @desc 定時処理のインタフェース、監視開始
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	start: async function(_sendIPCMessage ) {
		sendIPCMessage = _sendIPCMessage;
		if( mainArp.isRun ) {
			return;
		}
		mainArp.isRun = true;

		config.enabled    = store.get('config.Arp.enabled', true);
		config.debug      = store.get('config.Arp.debug',   false);
		persist           = store.get('persist.Arp', {});

		if( !config.enabled ) {
			config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.start() disabled.' ):0;
			return;
		}

		config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.start() config:\x1b[32m', config, '\x1b[0m' ):0;

		if( mainArp.observationJob ) {
			config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.observe() already started.' ):0;
		}

		mainArp.table = await arp.getTable();  // 監視前に一度実施
		mainArp.isRun = true;

		// 監視はcronで実施、10分毎
		mainArp.observationJob = cron.schedule('*/10 * * * *', async () => {
			config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.cron.schedule()'):0;

			if( config.enabled ) {
				mainArp.table   = await arp.getTable();
				persist = mainArp.table;
				arpModel.create( { detail: JSON.stringify(persist) } );
			}
		})
	},


	// interfaces
	/**
	 * @func stop
	 * @desc 停止
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	stop: async function () {
		config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.stop()'):0;
		mainArp.isRun = false;
		config.enabled = false;

		await mainArp.stopObservation();
	},

	/**
	 * @func stopWithoutSave
	 * @desc stopWithoutSave
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	stopWithoutSave: async function () {
		config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.stopWithoutSave()'):0;
		mainArp.isRun = false;
		config.enabled = false;

		await mainArp.stopObservation();
	},

	/**
	 * @func stopObservation
	 * @desc 監視をやめる
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	stopObservation: async function() {
		config.debug?console.log( new Date().toFormat("YYYY-MM-DDTHH24:MI:SS"), '| mainArp.stopObserve() observation.' ):0;

		if( mainArp.observationJob ) {
			await mainArp.observationJob.stop();
			mainArp.observationJob = null;
		}
	},


	// interfaces
	/**
	 * @func setConfig
	 * @desc 設定保存
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	setConfig: async function ( ) {
		await store.set('config.Arp', config );
		await store.set('persist.Arp', persist );
	},

	/**
	 * @func getConfig
	 * @desc 設定参照
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	getConfig: function () {
		return config;
	},

	/**
	 * @func getPersist
	 * @desc getPersist
	 * @async
	 * @param {void} 
	 * @return void
	 * @throw error
	 */
	getPersist: function() {
		return persist;
	}

};


module.exports = mainArp;
//////////////////////////////////////////////////////////////////////
// EOF
//////////////////////////////////////////////////////////////////////