Skip to content
Open
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,6 @@ sw.*
# Storybook
.nuxt-storybook
storybook-static

# test remote build script
remote-build.sh
10 changes: 10 additions & 0 deletions packages/be/modules/exec/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
console.log('📦 [module] exec')

// ///////////////////////////////////////////////////////////////////// Imports
// -----------------------------------------------------------------------------
const { RunStartupChecks } = require('@Module_Utilities')

// ////////////////////////////////////////////////////////////// Startup Checks
// -----------------------------------------------------------------------------
const checks = []
RunStartupChecks(checks)
53 changes: 53 additions & 0 deletions packages/be/modules/exec/rest/exec-remote.js
Original file line number Diff line number Diff line change
@@ -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)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@orvn I was wondering if you wanted to console log the non-error output of the script / send it back as part of the successful response?

SendData(res, 200, 'Successfully executed remote script')
})
.catch((err) => {
console.log('================================ [Endpoint: /exec-remote]')
console.log(err)
SendData(res, 404, 'An error occured')
})
})
7 changes: 7 additions & 0 deletions packages/fe/pages/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
14 changes: 14 additions & 0 deletions packages/fe/store/general.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}

Expand Down