Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: exec remote script endpoint #64

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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)
52 changes: 52 additions & 0 deletions packages/be/modules/exec/rest/exec-remote.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// ////////////////////////////////////////////////////////////////////// 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 = (command, path) => {
return new Promise((resolve, reject) => {
const executed = exec(REMOTE_EXEC_PATH + REMOTE_EXEC_FILENAME)
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) => {
const command = req.query.command
const path = req.query.path
const remoteProcess = executeRemoteProcess(command, path)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@orvn this function should be able to pass arguments from the get request into the shell script process. What should the structure look like coming from the query params? something like:

{
   foo: bar
}

gets passed to the script as:

--foo bar

.then((result) => {
console.log(result)
Copy link
Collaborator 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: {
command: 'ls',
path: 'crons'
}
})
await store.dispatch('general/getBaseData', { key: 'index', data: IndexPageData })
const response = await store.dispatch('datasets/getDatasetList', { route })
if (response.fail) {
Expand Down
15 changes: 15 additions & 0 deletions packages/fe/store/general.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,21 @@ 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
console.log(response.data)
return data
} catch (e) {
console.log('================== [Store Action: general/execRemoteScript]')
console.log(e)
return false
}
}
}

Expand Down