diff --git a/.gitignore b/.gitignore index 0163acb..5fbde0b 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ sw.* # Storybook .nuxt-storybook storybook-static + +# test remote build script +remote-build.sh diff --git a/packages/be/modules/exec/index.js b/packages/be/modules/exec/index.js new file mode 100644 index 0000000..1b687b9 --- /dev/null +++ b/packages/be/modules/exec/index.js @@ -0,0 +1,10 @@ +console.log('📦 [module] exec') + +// ///////////////////////////////////////////////////////////////////// Imports +// ----------------------------------------------------------------------------- +const { RunStartupChecks } = require('@Module_Utilities') + +// ////////////////////////////////////////////////////////////// Startup Checks +// ----------------------------------------------------------------------------- +const checks = [] +RunStartupChecks(checks) diff --git a/packages/be/modules/exec/rest/exec-remote.js b/packages/be/modules/exec/rest/exec-remote.js new file mode 100644 index 0000000..254bbb1 --- /dev/null +++ b/packages/be/modules/exec/rest/exec-remote.js @@ -0,0 +1,53 @@ +// ////////////////////////////////////////////////////////////////////// Import +// ----------------------------------------------------------------------------- +const Path = require('path') +const exec = require('child_process').exec + +const { SendData } = require('@Module_Utilities') +const MC = require('@Root/config') +require('dotenv').config({ path: Path.resolve(__dirname, '../.env') }) + +const REMOTE_EXEC_ENPOINT = process.env.REMOTE_EXEC_ENDPOINT +const REMOTE_EXEC_PATH = process.env.REMOTE_EXEC_PATH +const REMOTE_EXEC_FILENAME = process.env.REMOTE_EXEC_FILENAME + +// /////////////////////////////////////////////////////////////////// Functions +// ----------------------------------------------------------------------------- +const executeRemoteProcess = (params = {}) => { + return new Promise((resolve, reject) => { + let command = REMOTE_EXEC_PATH + REMOTE_EXEC_FILENAME + Object.keys(params).forEach((key) => { + command = `${command} --${key} ${params[key]}` + }) + const executed = exec(command) + const results = [] + const errors = [] + executed.stdout.on('data', (msg) => { + results.push(msg.toString()) + }) + executed.stderr.on('data', msg => { + errors.push(msg.toString()) + }) + executed.on('exit', (code) => { + const err = errors.length > 0 && code !== 0 + if (err) { + reject(errors.join('\n')) + } + resolve(results.join('\n')) + }) + }) +} +// //////////////////////////////////////////////////////////////////// Endpoint +// ----------------------------------------------------------------------------- +MC.app.get(REMOTE_EXEC_ENPOINT, async (req, res) => { + executeRemoteProcess(req.query) + .then((result) => { + console.log(result) + SendData(res, 200, 'Successfully executed remote script') + }) + .catch((err) => { + console.log('================================ [Endpoint: /exec-remote]') + console.log(err) + SendData(res, 404, 'An error occured') + }) +}) diff --git a/packages/fe/pages/index.vue b/packages/fe/pages/index.vue index 5156261..bff95a3 100644 --- a/packages/fe/pages/index.vue +++ b/packages/fe/pages/index.vue @@ -86,6 +86,13 @@ export default { }, async fetch ({ app, store, route, redirect }) { + await store.dispatch('general/execRemoteScript', { + endpoint: '/execute-remote-shell-script', + params: { + foo: 'hello', + bar: 'world' + } + }) await store.dispatch('general/getBaseData', { key: 'index', data: IndexPageData }) const response = await store.dispatch('datasets/getDatasetList', { route }) if (response.fail) { diff --git a/packages/fe/store/general.js b/packages/fe/store/general.js index 046332d..35a7584 100644 --- a/packages/fe/store/general.js +++ b/packages/fe/store/general.js @@ -94,6 +94,20 @@ const actions = { setClipboard ({ commit }, text) { this.$addTextToClipboard(text) commit('SET_CLIPBOARD', text) + }, + // ////////////////////////////////////////////////////////// execRemoteScript + async execRemoteScript ({ commit, getters }, payload) { + try { + const endpoint = payload.endpoint + const params = payload.params + const response = await this.$axiosAuth.get(endpoint, { params }) + const data = response.data.payload + return data + } catch (e) { + console.log('================== [Store Action: general/execRemoteScript]') + console.log(e) + return false + } } }