exec.py 2.5 KB
Newer Older
mathieui's avatar
mathieui committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
"""
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.

"""
louiz’'s avatar
louiz’ committed
37 38 39 40 41 42 43

from plugin import BasePlugin
import common
import subprocess

class Plugin(BasePlugin):
    def init(self):
44
        self.api.add_command('exec', self.command_exec,
45 46 47
                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.\nExample: /exec -O \"uptime\" will send “uptime\n20:36:19 up  3:47,  4 users,  load average: 0.09, 0.13, 0.09” in the current conversation.',
                short='Execute a command')
louiz’'s avatar
louiz’ committed
48 49 50 51 52 53 54 55 56 57

    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:
58
            self.api.run_command('/help exec')
louiz’'s avatar
louiz’ committed
59 60
            return
        try:
61
            process = subprocess.Popen(['sh', '-c', command], stdout=subprocess.PIPE)
louiz’'s avatar
louiz’ committed
62
        except OSError as e:
63
            self.api.information('Failed to execute command: %s' % (e,), 'Error')
louiz’'s avatar
louiz’ committed
64 65 66
            return
        result = process.communicate()[0].decode('utf-8')
        if arg and arg == '-o':
67 68
            if not self.api.send_message('%s' % (result,)):
                self.api.information('Cannot send result (%s), this is not a conversation tab' % result)
louiz’'s avatar
louiz’ committed
69
        elif arg and arg == '-O':
70 71
            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)
louiz’'s avatar
louiz’ committed
72
        else:
73
            self.api.information('%s:\n%s' % (command, result), 'Info')
louiz’'s avatar
louiz’ committed
74
        return