2013-04-13 20:33:06 +00:00
"""
This plugin lets you execute a system command through poezio .
Usage
- - - - -
. . warning : : Running commands that start a daemon or an interface is not a good
idea .
. . glossary : :
/ exec
* * Usage : * * ` ` / exec [ - o | - O ] < command > ` `
Execute a system command .
: :
/ exec command
Will give you the result in the information buffer .
: :
/ exec - o command
Will send the result of the command into the current tab , if possible .
: :
/ exec - O command
Will send the result of the command and the command summary into the current
tab , if possible .
"""
2011-09-25 19:16:31 +00:00
2016-06-27 23:10:52 +00:00
from poezio . plugin import BasePlugin
from poezio import common
2017-10-08 19:44:32 +00:00
import asyncio
2011-09-25 19:16:31 +00:00
import subprocess
2018-08-15 11:13:17 +00:00
2011-09-25 19:16:31 +00:00
class Plugin ( BasePlugin ) :
def init ( self ) :
2018-08-15 11:13:17 +00:00
self . api . add_command (
' exec ' ,
self . command_exec ,
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
2018-07-28 11:31:25 +00:00
async def async_exec ( self , command , arg ) :
2018-08-15 11:13:17 +00:00
create = asyncio . create_subprocess_exec (
' sh ' ,
' -c ' ,
command ,
stdout = subprocess . PIPE ,
stderr = subprocess . PIPE )
2017-10-08 19:44:32 +00:00
try :
2018-07-28 11:31:25 +00:00
process = await create
2017-10-08 19:44:32 +00:00
except OSError as e :
2018-08-15 11:13:17 +00:00
self . api . information ( ' Failed to execute command: %s ' % ( e , ) ,
' Error ' )
2017-10-08 19:44:32 +00:00
return
2018-07-28 11:31:25 +00:00
stdout , stderr = await process . communicate ( )
2017-10-08 19:44:32 +00:00
result = stdout . decode ( ' utf-8 ' )
stderr = stderr . decode ( ' utf-8 ' )
if arg == ' -o ' :
2018-08-15 11:13:17 +00:00
if not self . api . send_message ( ' %s ' % ( result , ) ) :
self . api . information (
' Cannot send result ( %s ), this is not a conversation tab ' %
result , ' Error ' )
2017-10-08 19:44:32 +00:00
elif arg == ' -O ' :
if not self . api . send_message ( ' %s : \n %s ' % ( command , result ) ) :
2018-08-15 11:13:17 +00:00
self . api . information (
' Cannot send result ( %s ), this is not a conversation tab ' %
result , ' Error ' )
2017-10-08 19:44:32 +00:00
else :
self . api . information ( ' %s : \n %s ' % ( command , result ) , ' Info ' )
if stderr :
2018-08-15 11:13:17 +00:00
self . api . information ( ' stderr for %s : \n %s ' % ( command , stderr ) ,
' Info ' )
2018-07-28 11:31:25 +00:00
await process . wait ( )
2017-10-08 19:44:32 +00:00
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
2017-10-08 19:44:32 +00:00
asyncio . ensure_future ( self . async_exec ( command , arg ) )