Unix: Add @shell command

This commit is contained in:
nyuszika7h 2014-02-27 15:46:38 +01:00
parent bc4cfb96dd
commit 322023c011

View File

@ -328,10 +328,10 @@ class Unix(callbacks.Plugin):
args = [uptimeCmd]
try:
with open(os.devnull) as null:
inst = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=null)
inst = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=null)
except OSError as e:
irc.error('It seems the configured uptime command was '
'not available.', Raise=True)
@ -388,9 +388,10 @@ class Unix(callbacks.Plugin):
args = shlex.split(text)
try:
with open(os.devnull) as null:
inst = subprocess.Popen(args, stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=null)
inst = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=null)
except OSError as e:
irc.error('It seems the requested command was '
'not available (%s).' % e, Raise=True)
@ -398,10 +399,40 @@ class Unix(callbacks.Plugin):
if result[1]: # stderr
irc.error(' '.join(result[1].decode('utf8').split()))
if result[0]: # stdout
response = result[0].decode('utf8').split("\n");
response = result[0].decode('utf8').splitlines()
response = [l for l in response if l]
irc.replies(response)
call = thread(wrap(call, ["owner", "text"]))
def shell(self, irc, msg, args, text):
"""<command to call with any arguments>
Calls any command available on the system using a shell, and
returns its output.
Requires owner capability.
Note that being restricted to owner, this command does not do any
sanity checking on input/output. So it is up to you to make sure
you don't run anything that will spamify your channel or that
will bring your machine to its knees.
"""
try:
with open(os.devnull) as null:
inst = subprocess.Popen(text,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=null)
except OSError as e:
irc.error('It seems the shell (%s) was not available (%s)' %
(os.getenv('SHELL'), e), Raise=True)
result = inst.communicate()
if result[1]: # stderr
irc.error(' '.join(result[1].decode('utf8').split()))
if result[0]: # stdout
response = result[0].decode('utf8').splitlines()
response = [l for l in response if l]
irc.replies(response)
shell = thread(wrap(shell, ["owner", "text"]))
Class = Unix
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: