2011-09-25 19:16:31 +00:00
# A plugin that can execute a command and send the result in the conversation
from plugin import BasePlugin
import os
import common
import shlex
import subprocess
class Plugin ( BasePlugin ) :
def init ( self ) :
2013-03-08 21:53:35 +00:00
self . api . add_command ( ' exec ' , self . command_exec ,
2013-03-01 18:25:31 +00:00
usage = ' [-o|-O] <command> ' ,
help = ' Execute a shell command and prints the result in the information buffer. The command should be ONE argument, that means it should be between \" \" . The first argument (before the command) can be -o or -O. If -o is specified, it sends the result in the current conversation. If -O is specified, it sends the command and its result in the current conversation. \n Example: /exec -O \" uptime \" will send “uptime \n 20:36:19 up 3:47, 4 users, load average: 0.09, 0.13, 0.09” in the current conversation. ' ,
short = ' Execute a command ' )
2011-09-25 19:16:31 +00:00
def command_exec ( self , args ) :
args = common . shell_split ( args )
if len ( args ) == 1 :
command = args [ 0 ]
arg = None
elif len ( args ) == 2 :
command = args [ 1 ]
arg = args [ 0 ]
else :
2013-03-08 21:53:35 +00:00
self . api . run_command ( ' /help exec ' )
2011-09-25 19:16:31 +00:00
return
try :
2011-11-10 04:19:34 +00:00
process = subprocess . Popen ( [ ' sh ' , ' -c ' , command ] , stdout = subprocess . PIPE )
2011-09-25 19:16:31 +00:00
except OSError as e :
2013-03-08 21:53:35 +00:00
self . api . information ( ' Failed to execute command: %s ' % ( e , ) , ' Error ' )
2011-09-25 19:16:31 +00:00
return
result = process . communicate ( ) [ 0 ] . decode ( ' utf-8 ' )
if arg and arg == ' -o ' :
2013-03-08 21:53:35 +00:00
if not self . api . send_message ( ' %s ' % ( result , ) ) :
self . api . information ( ' Cannot send result ( %s ), this is not a conversation tab ' % result )
2011-09-25 19:16:31 +00:00
elif arg and arg == ' -O ' :
2013-03-08 21:53:35 +00:00
if not self . api . send_message ( ' %s : \n %s ' % ( command , result ) ) :
self . api . information ( ' Cannot send result ( %s ), this is not a conversation tab ' % result )
2011-09-25 19:16:31 +00:00
else :
2013-03-08 21:53:35 +00:00
self . api . information ( ' %s : \n %s ' % ( command , result ) , ' Info ' )
2011-09-25 19:16:31 +00:00
return