Execute: make running commands asynchronous

This prevents deluge from hanging while it waits
for a command to finish.
This also prevents a deadlock from occuring
(c.f. warning at
 http://docs.python.org/library/subprocess.html#subprocess.Popen.wait)
This commit is contained in:
John Garland 2012-03-01 18:15:09 +11:00
parent 2ae936df44
commit b0029517eb

View file

@ -36,7 +36,7 @@
import os
import time
import hashlib
from subprocess import Popen, PIPE
from twisted.internet.utils import getProcessValue
from deluge.log import LOG as log
from deluge.plugins.pluginbase import CorePluginBase
@ -110,15 +110,18 @@ class Core(CorePluginBase):
log.debug("[execute] Running commands for %s", event)
def log_error(exit_code, command):
if exit_code:
log.warn("[execute] command '%s' failed with exit code %d", command, exit_code)
# Go through and execute all the commands
for command in self.config["commands"]:
if command[EXECUTE_EVENT] == event:
command = os.path.expandvars(command[EXECUTE_COMMAND])
command = os.path.expanduser(command)
log.debug("[execute] running %s", command)
p = Popen([command, torrent_id, torrent_name, save_path], stdin=PIPE, stdout=PIPE, stderr=PIPE)
if p.wait() != 0:
log.warn("Execute command failed with exit code %d", p.returncode)
d = getProcessValue(command, (torrent_id, torrent_name, save_path), env=os.environ)
d.addCallback(log_error, command)
def disable(self):
self.config.save()