mirror of https://github.com/MISP/MISP
chg: [workflows] Allow running workflows via the editor interface
parent
ce9eac725f
commit
30a5db3b9f
|
@ -161,19 +161,21 @@ class WorkflowsController extends AppController
|
|||
|
||||
public function executeWorkflow($workflow_id)
|
||||
{
|
||||
$this->request->allowMethod(['post', 'put']);
|
||||
$blockingErrors = [];
|
||||
$data = $this->request->data;
|
||||
$result = $this->Workflow->executeWorkflow($workflow_id, $data, $blockingErrors);
|
||||
if (!empty($logging) && empty($result['success'])) {
|
||||
$logging['message'] = !empty($logging['message']) ? $logging['message'] : __('Error while executing workflow.');
|
||||
$errorMessage = implode(', ', $blockingErrors);
|
||||
$this->Workflow->loadLog()->createLogEntry('SYSTEM', $logging['action'], $logging['model'], $logging['id'], $logging['message'], __('Returned message: %s', $errorMessage));
|
||||
if ($this->request->is('post') || $this->request->is('put')) {
|
||||
$blockingErrors = [];
|
||||
$data = JsonTool::decode($this->request->data['Workflow']['data']);
|
||||
$result = $this->Workflow->executeWorkflow($workflow_id, $data, $blockingErrors);
|
||||
if (!empty($logging) && empty($result['success'])) {
|
||||
$logging['message'] = !empty($logging['message']) ? $logging['message'] : __('Error while executing workflow.');
|
||||
$errorMessage = implode(', ', $blockingErrors);
|
||||
$this->Workflow->loadLog()->createLogEntry('SYSTEM', $logging['action'], $logging['model'], $logging['id'], $logging['message'], __('Returned message: %s', $errorMessage));
|
||||
}
|
||||
return $this->RestResponse->viewData([
|
||||
'success' => $result['success'],
|
||||
'outcome' => $result['outcomeText'],
|
||||
], $this->response->type());
|
||||
}
|
||||
return $this->RestResponse->viewData([
|
||||
'success' => $result['success'],
|
||||
'outcome' => $result['outcomeText'],
|
||||
], $this->response->type());
|
||||
$this->render('ajax/executeWorkflow');
|
||||
}
|
||||
|
||||
public function triggers()
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
echo $this->element('genericElements/Form/genericForm', [
|
||||
'form' => $this->Form,
|
||||
'data' => [
|
||||
'title' => __('Execute Workflow'),
|
||||
'model' => 'Workflow',
|
||||
'skip_side_menu' => 1,
|
||||
'fields' => [
|
||||
[
|
||||
'field' => 'data',
|
||||
'type' => 'textarea',
|
||||
'class' => 'input span6'
|
||||
]
|
||||
],
|
||||
'submit' => [
|
||||
'action' => $this->request->params['action'],
|
||||
]
|
||||
]
|
||||
]);
|
|
@ -9,7 +9,6 @@ echo $this->element('genericElements/Form/genericForm', [
|
|||
],
|
||||
'submit' => [
|
||||
'action' => $this->request->params['action'],
|
||||
// 'ajaxSubmit' => 'submitGenericFormInPlace();'
|
||||
]
|
||||
]
|
||||
]);
|
||||
|
|
|
@ -50,11 +50,15 @@ $debugEnabled = !empty($selectedWorkflow['Workflow']['debug_enabled']);
|
|||
<span id="workflow-saved-text-details" style="margin-left: 5px; font-size: 0.75em"></span>
|
||||
</span>
|
||||
<span style="display: flex; align-items: center; margin-left: auto; margin-right: 1em; gap: 1em;">
|
||||
<button id="workflow-debug-container" class="btn btn-<?= $debugEnabled ? 'success' : 'primary' ?>" data-enabled="<?= $debugEnabled ? '1' : '0' ?>" style="margin-right: 0.5em;">
|
||||
<button id="workflow-debug-button" class="btn btn-<?= $debugEnabled ? 'success' : 'primary' ?>" data-enabled="<?= $debugEnabled ? '1' : '0' ?>">
|
||||
<i class="<?= $this->FontAwesome->getClass('bug') ?> fa-fw"></i>
|
||||
<?= __('Debug Mode: ') ?>
|
||||
<b class="state-text" data-on="<?= __('On') ?>" data-off="<?= __('Off') ?>"><?= $debugEnabled ? __('On') : __('Off') ?></b>
|
||||
</button>
|
||||
<button id="workflow-run-button" class="btn btn-primary" <?= $debugEnabled ? '' : 'disabled' ?>>
|
||||
<i class="<?= $this->FontAwesome->getClass('play') ?> fa-fw"></i>
|
||||
<?= __('Run Workflow') ?>
|
||||
</button>
|
||||
<a href="<?= $baseurl . '/admin/logs/index/model:Workflow/action:execute_workflow/model_id:' . h($selectedWorkflow['Workflow']['id']) ?>" title="<?= __('View execution logs') ?>" aria-label="<?= __('View execution logs') ?>">
|
||||
<i class="<?= $this->FontAwesome->getClass('list-alt') ?>"></i> <?= __('Execution logs') ?>
|
||||
</a>
|
||||
|
@ -306,7 +310,8 @@ echo $this->element('genericElements/assetLoader', [
|
|||
var $importWorkflowButton = $('#importWorkflow')
|
||||
var $exportWorkflowButton = $('#exportWorkflow')
|
||||
var $saveWorkflowButton = $('#saveWorkflow')
|
||||
var $toggleWorkflowButton = $('#workflow-debug-container')
|
||||
var $toggleWorkflowButton = $('#workflow-debug-button')
|
||||
var $runWorkflowButton = $('#workflow-run-button')
|
||||
var $saveBlueprintButton = $('#saveBlueprint')
|
||||
var $lastModifiedField = $('#lastModifiedField')
|
||||
var $workflowSavedIconContainer = $('#workflow-saved-container')
|
||||
|
|
|
@ -328,6 +328,7 @@ function initDrawflow() {
|
|||
$importWorkflowButton.click(importWorkflow)
|
||||
$exportWorkflowButton.click(exportWorkflow)
|
||||
$toggleWorkflowButton.click(enabledDebugMode)
|
||||
$runWorkflowButton.click(runWorkflow)
|
||||
$blockModal
|
||||
.on('show', function (evt) {
|
||||
var selectedNode = getSelectedNode()
|
||||
|
@ -1136,10 +1137,58 @@ function enabledDebugMode() {
|
|||
$clicked.removeClass('btn-success').addClass('btn-primary')
|
||||
}
|
||||
$clicked.find('.state-text').text($clicked.find('.state-text').data($clicked.data('enabled') ? 'on' : 'off'))
|
||||
$runWorkflowButton.prop('disabled', $clicked.data('enabled') ? false : true)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function runWorkflow() {
|
||||
var html = '<div style="width: 350px;"><textarea rows=15 style="width: 100%; box-sizing: border-box;" placeholder="Enter data to be sent to the workflow"></textarea><div style="display: flex;"><button class="btn btn-primary" style="margin: 0 0 0 auto;"><i class="fa fa-spin fa-spinner hidden"></i> Run Workflow</button></div><pre style="margin-top: 0.75em;"></pre></div>'
|
||||
var popoverOptions = {
|
||||
html: true,
|
||||
placement: 'bottom',
|
||||
trigger: 'click',
|
||||
content: html,
|
||||
container: 'body',
|
||||
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"><div class="data-content"></div></div></div>'
|
||||
}
|
||||
$runWorkflowButton
|
||||
.popover(popoverOptions)
|
||||
.on('shown.bs.popover', function () {
|
||||
var $popover = $runWorkflowButton.data('popover').tip()
|
||||
$popover.find('button').click(function() {
|
||||
var url = baseurl + "/workflows/executeWorkflow/" + workflow.Workflow.id
|
||||
fetchFormDataAjax(url, function (formHTML) {
|
||||
$('body').append($('<div id="temp" style="display: none"/>').html(formHTML))
|
||||
var $tmpForm = $('#temp form')
|
||||
var formUrl = $tmpForm.attr('action')
|
||||
data = $popover.find('textarea').val()
|
||||
$tmpForm.find('[name="data[Workflow][data]"]').val(data)
|
||||
|
||||
$.ajax({
|
||||
data: $tmpForm.serialize(),
|
||||
beforeSend: function() {
|
||||
$popover.find('pre').empty()
|
||||
$popover.find('button i').removeClass('hidden')
|
||||
},
|
||||
success: function (data) {
|
||||
$popover.find('pre').text(data)
|
||||
},
|
||||
error: xhrFailCallback,
|
||||
complete: function () {
|
||||
$('#temp').remove();
|
||||
$popover.find('button i').addClass('hidden')
|
||||
},
|
||||
type: 'post',
|
||||
cache: false,
|
||||
url: formUrl,
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
$runWorkflowButton.popover('show')
|
||||
}
|
||||
|
||||
function getSelectedNodeID() {
|
||||
return editor.node_selected !== null ? editor.node_selected.id : null // Couldn't find a better way to get the selected node
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue