diff --git a/brains/say.yml b/brains/say.yml index a9c2703..b602cd8 100644 --- a/brains/say.yml +++ b/brains/say.yml @@ -44,3 +44,4 @@ - shell: cmd: "firefox http://fr-fr.facebook.com/&" async: True + diff --git a/resources/neurons/.gitignore b/resources/neurons/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/resources/neurons/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/resources/neurons/run/__init__.py b/resources/neurons/run/__init__.py new file mode 100644 index 0000000..a9f5847 --- /dev/null +++ b/resources/neurons/run/__init__.py @@ -0,0 +1 @@ +from run import Run diff --git a/resources/neurons/run/run.py b/resources/neurons/run/run.py new file mode 100644 index 0000000..9238b24 --- /dev/null +++ b/resources/neurons/run/run.py @@ -0,0 +1,77 @@ +import logging +import subprocess +import threading +from kalliope.core.NeuronModule import NeuronModule, MissingParameterException + +logging.basicConfig() +logger = logging.getLogger("kalliope") + + +class AsyncRun(threading.Thread): + """ + Class used to run an asynchrone Shell command + + .. notes:: Impossible to get the success code of the command + """ + def __init__(self, cmd): + self.stdout = None + self.stderr = None + self.cmd = cmd + threading.Thread.__init__(self) + + def run(self): + p = subprocess.Popen(self.cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + self.stdout, self.stderr = p.communicate() + + +class Run(NeuronModule): + """ + Run a shell command in a synchron mode + """ + def __init__(self, **kwargs): + super(Run, self).__init__(**kwargs) + + # get the command + self.cmd = kwargs.get('application', None) + # get if the user select a blocking command or not + self.async = kwargs.get('async', False) + self.query = kwargs.get('query', None) + + if self.query is not None: + self.cmd = self.cmd + "\"" + self.query +"\"" + + # check parameters + if self._is_parameters_ok(): + # run the command + self.cmd = "%s&" % (self.cmd.lower()) + print self.cmd + if not self.async: + p = subprocess.Popen(self.cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + (output, err) = p.communicate() + self.output = output + self.returncode = p.returncode + message = { + "output": self.output, + "returncode": self.returncode + } + self.say(message) + + else: + async_shell = AsyncRun(cmd=self.cmd) + async_shell.start() + + def _is_parameters_ok(self): + """ + Check if received parameters are ok to perform operations in the neuron + :return: true if parameters are ok, raise an exception otherwise + + .. raises:: MissingParameterException + """ + if self.cmd is None: + raise MissingParameterException("cmd parameter required") + + return True