diff --git a/monkey/monkey_island/cc/resources/local_run.py b/monkey/monkey_island/cc/resources/local_run.py
index d743fc835..045729787 100644
--- a/monkey/monkey_island/cc/resources/local_run.py
+++ b/monkey/monkey_island/cc/resources/local_run.py
@@ -51,7 +51,7 @@ def run_local_monkey():
logger.error('popen failed', exc_info=True)
return False, "popen failed: %s" % exc
- return True, "pis: %s" % pid
+ return True, ""
class LocalRun(flask_restful.Resource):
diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/IslandMonkeyRunErrorModal.js b/monkey/monkey_island/cc/ui/src/components/ui-components/IslandMonkeyRunErrorModal.js
new file mode 100644
index 000000000..8b2a8857d
--- /dev/null
+++ b/monkey/monkey_island/cc/ui/src/components/ui-components/IslandMonkeyRunErrorModal.js
@@ -0,0 +1,100 @@
+import {Modal} from 'react-bootstrap';
+import React from 'react';
+import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
+import {faExclamationTriangle} from '@fortawesome/free-solid-svg-icons';
+
+
+class IslandMonkeyRunErrorModal extends React.PureComponent {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ showModal: this.props.showModal,
+ errorDetails: this.props.errorDetails
+ };
+ }
+
+ componentDidUpdate(prevProps) {
+ if (this.props !== prevProps) {
+ this.setState({
+ showModal: this.props.showModal,
+ errorDetails: this.props.errorDetails
+ })
+ }
+ }
+
+ getMissingBinariesContent() {
+ return (
+
+ Some Monkey binaries are not found where they should be...
+ You can download the files from
here ,
+ at the bottommost section titled "Assets", and place them under the
+ directory
monkey/monkey_island/cc/binaries
.
+
+ )
+ }
+
+ getMonkeyAlreadyRunningContent() {
+ return (
+
+ Most likely, monkey is already running on the Island. Wait until it finishes or kill the process to run again.
+
+ )
+ }
+
+ getUndefinedErrorContent() {
+ return (
+
+ You encountered an undefined error. Please report it to support@infectionmonkey.com or our slack channel.
+
+ )
+ }
+
+ getDisplayContentByError(errorMsg) {
+ if (errorMsg.includes('Permission denied:')) {
+ return this.getMonkeyAlreadyRunningContent()
+ } else if (errorMsg.startsWith('Copy file failed')) {
+ return this.getMissingBinariesContent()
+ } else {
+ return this.getUndefinedErrorContent()
+ }
+ }
+
+ render = () => {
+ return (
+ this.props.onClose()}>
+
+
+ Uh oh...
+
+
+
+
+ {this.getDisplayContentByError(this.state.errorDetails)}
+
+
+
+
+ Error Details
+
+
+
+ {this.state.errorDetails}
+
+
+
+ this.props.onClose()}>
+ Dismiss
+
+
+
+
+ )
+ };
+
+}
+
+export default IslandMonkeyRunErrorModal;
diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MissingBinariesModal.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MissingBinariesModal.js
deleted file mode 100644
index ae7f6ac4e..000000000
--- a/monkey/monkey_island/cc/ui/src/components/ui-components/MissingBinariesModal.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import {Modal} from 'react-bootstrap';
-import React from 'react';
-
-
-class MissingBinariesModal extends React.PureComponent {
-
- constructor(props) {
- super(props);
-
- this.state = {
- showModal: this.props.showModal,
- errorDetails: this.props.errorDetails
- };
- }
-
- componentDidUpdate(prevProps) {
- if (this.props !== prevProps) {
- this.setState({
- showModal: this.props.showModal,
- errorDetails: this.props.errorDetails
- })
- }
- }
-
- render = () => {
- return (
- this.props.onClose()}>
-
-
- Uh oh...
-
-
-
-
- Some Monkey binaries are not found where they should be...
- You can download the files from here ,
- at the bottommost section titled "Assets", and place them under the directory monkey/monkey_island/cc/binaries
.
-
-
-
-
- Error Details
-
-
-
- {this.state.errorDetails}
-
-
-
- this.props.onClose()}>
- Dismiss
-
-
-
-
- )
- };
-
-}
-
-export default MissingBinariesModal;