'use strict' /** * Copyright (c) 2017~2021, OBCon Inc. * All rights reserved. */ /** * @file * @copyright 2017~2021, OBCon Inc. * @author gye hyun james kim [pnuskgh@gmail.com] */ const fs = require('fs'); const path = require('path'); const archiver = require('archiver'); const readline = require("readline"); // const inquirer = require('inquirer'); // const util = require('util'); class Deploy { constructor(answer) { this._version = null; this._folderSource = null; this._folderTarget = null; this._ident = 0; this._answer = answer; this.init(); } init() { //--- 환경 변수 등 설정 process.env.NODE_ENV = 'production'; process.chdir(path.join(__dirname, '..')); global.appl = { root: process.cwd().replace(/\\/g, '/') }; let configFile = 'config_scada_override.js'; switch (this._answer) { case '1': //--- OBCon SCADA default: appl.name = 'OBCon SCADA'; appl.type = 'obcon_scada'; configFile = 'config_scada_override.js'; break; } if (!fs.existsSync(path.join(appl.root, configFile))) { console.error(`Error: 설정 파일이 존재하지 않습니다 - ${configFile}`); process.exit(3); } //--- 설정 정보 로딩 global.config = require(path.join(appl.root, configFile)); config.logger.filename = 'deploy_%DATE%.log'; //--- Global Utility 함수 로드 global.utils = require(path.join(appl.root, 'include', 'global_utils.js')); global.utils = utils.getClass('include', 'global_utils.js'); //--- utils을 사용하여 utils을 다시 로드 //--- Global Logger 설정 : logger.info(), logger.warn(), logger.error() global.logger = utils.getModule('include', 'logger.js').createLogger(); //--- __dirname, __filename logger.debug('설정 정보 로딩'); logger.debug('Global Utility 함수 로드'); logger.debug('Global Logger 설정'); this._folderSource = appl.root; this._folderTarget = path.join(appl.root, 'dist', appl.type); this._version = utils.getModule('include', 'Version.js'); } copyFile(filename, folder='', ident=0) { let source = path.join(this._folderSource, folder, filename); let target = path.join(this._folderTarget, folder); fs.existsSync(target) || fs.mkdirSync(target); fs.existsSync(source) && fs.copyFileSync(source, path.join(target, filename)); // console.log(''.padStart(ident, ' '), path.join(folder, filename)); } copyFolder(folder='', ident=0, filenames=null, isCurrentFolder=false) { // console.log(''.padStart(ident, ' '), 'Folder :', `${folder}/`); let target = path.join(this._folderTarget, folder); fs.existsSync(target) || fs.mkdirSync(target); let data = filenames || fs.readdirSync(path.join(this._folderSource, folder)); data.forEach(name => { if (fs.statSync(path.join(this._folderSource, folder, name)).isDirectory()) { if (isCurrentFolder == false) { this.copyFolder(path.join(folder, name), ident + 4); } } else { this.copyFile(name, folder, ident + 4); } }); } deleteFile(filename, folder='', ident=0) { let target = path.join(this._folderTarget, folder, filename); fs.existsSync(target) && fs.unlinkSync(target); // console.log(''.padStart(ident, ' '), path.join(folder, filename)); } deleteFolder(folder='', ident=0) { // console.log(''.padStart(ident, ' '), 'Folder :', `${folder}/`); let data = fs.readdirSync(path.join(this._folderTarget, folder)); data.forEach(name => { if (fs.statSync(path.join(this._folderTarget, folder, name)).isDirectory()) { this.deleteFolder(path.join(folder, name), ident + 4); } else { this.deleteFile(name, folder, ident + 4); } }); fs.rmdirSync(path.join(this._folderTarget, folder)); } makeZip(folder, zipFilename) { fs.existsSync(zipFilename) && fs.unlinkSync(zipFilename); let archive = archiver('zip'); let output = fs.createWriteStream(zipFilename); output.on('close', function () { console.log(`${zipFilename} file : ${archive.pointer()} bytes`); }); archive.on('error', function(err) { throw err; }); archive.pipe(output); archive.directory(folder, false); archive.finalize(); } async deploy() { try { console.log(); console.log('------------------------------------------------------------'); console.log('--- Deploy'); console.log(`Source folder : ${this._folderSource}`); console.log(`Target folder : ${this._folderTarget}`); console.log(`Version : ${this._version.version.version}`); fs.existsSync(this._folderTarget) || fs.mkdirSync(this._folderTarget); console.log(); this.deleteFolder(); fs.mkdirSync(this._folderTarget); //--- Folder : .nyc_output/ //--- Folder : coverage/ //--- Folder : dist/ //--- Folder : files/ //--- Folder : install/ //--- Folder : logs/ //--- Folder : manual/ //--- Folder : node_modules/ //--- Folder : sessions/ //--- Folder : src/ //--- Folder : test/ //--- Folder : upgrades/ //--- Folder : zztest/ switch (appl.type) { case 'obcon_scada': default: await this.deploy_obcon_scada(); break; } //--- zip 파일 생성 let version = this._version.version.version.replace(/\./g, ''); let zipFilename = `${this._folderTarget}_${version}.zip`; this.makeZip(this._folderTarget, zipFilename); this._version.next(); this._version.write(); console.log(); } catch(err) { console.log('Error', err); } } async deploy_obcon_scada() { try { let filenames = []; //--- Folder : bin/ filenames = [ 'clearService.bash', 'watchfiles.js', 'findContent.js' ]; this.copyFolder('bin', 0, filenames); //--- Folder : conf/ filenames = [ 'config.js' ]; this.copyFolder('conf', 0, filenames); //--- Folder : custom/ //--- To-Do: 향후 해당 서비스에 해당하는 폴더만 복사할 것 this.copyFolder('custom', 0); //--- Folder : include/ this.copyFolder('include', 0); //--- Folder : interfaces/ filenames = [ 'interfaces.js', 'thing_plug.js' ]; this.copyFolder('interfaces', 0, filenames); this.copyFolder(path.join('interfaces', 'v100'), 4); this.copyFolder(path.join('interfaces', 'v101'), 4); this.copyFolder(path.join('interfaces', 'v102'), 4); //--- Folder : modules/ filenames = [ 'modules.js', 'http_app.js', 'tcp_app.js', 'tcp_server.js', 'tcp_server_client.js', 'udp_app.js', 'udp_server.js', 'mqtt_app.js', 'mqtt_client.js', 'proxy_client.js' ]; this.copyFolder('modules', 0, null, true); config.service.modules.forEach(folder => { this.copyFolder(path.join('modules', folder), 4); }); this.copyFolder(path.join('modules', 'batch'), 4); this.copyFolder(path.join('modules', 'markdowns'), 4); //--- Folder : openapis/ this.copyFolder('openapis', 0); //--- Folder : themes/ //--- To-Do: 향후 해당 서비스에 해당하는 폴더만 복사할 것 this.copyFolder('modules', 0, [], true); fs.existsSync(path.join(this._folderTarget, 'themes')) || fs.mkdirSync(path.join(this._folderTarget, 'themes')); this.copyFolder(path.join('themes', 'default'), 4); this.copyFolder(path.join('themes', 'service_scada_caprotec'), 4); this.copyFolder(path.join('themes', 'service_scada_ursc'), 4); this.copyFolder(path.join('themes', 'service_scada_techpalm'), 4); this.copyFolder(path.join('themes', 'theme_obcon_2021'), 4); } catch(err) { console.log('Error', err); } } } console.time('경과 시간'); console.group('Application 이름을 선택 하세요.'); console.log('%d. %cOBCon SCADA', 1, 'color:blue; font-size:40px;'); console.groupEnd(); let deploy = new Deploy('1'); // const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // rl.on('line', async function(answer) { // rl.close(); // await deploy.deploy(); // console.timeEnd('경과 시간'); // }); deploy.deploy();