summaryrefslogtreecommitdiff
path: root/scripts/python/shell.py
blob: 1d14b3db5a8850817612151e345e3a006071baae (plain)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

# =============================================================================
#  shell.py (c) March 2006 by Kolter <kolter+dev@openics.org>
#
#  Licence     : GPL v2
#  Description : running shell commands in WeeChat
#  Syntax      : try /help shell to get some help on this script
#  Precond     : needs weechat > 0.1.7 to run else it will crash WeeChat ;-)
#
#
# ### changelog ###
#
#  * version 0.1 :
#      - first release
#
# =============================================================================

import weechat, os, popen2

SHELL_CMD="shell"
SHELL_PREFIX="[shell] "

weechat.register ("Shell", "0.1", "", "Running shell commands in WeeChat")
weechat.add_command_handler(
    SHELL_CMD,
    "shell",
    "Running shell commands in WeeChat",
    "[-o] <command line>",
    "            -o :  print output on current server/channel\n"
    "<command line> :  shell command or builtin like cd, getenv, setenv, unsetenv",
    "-o|cd|getenv|setenv|unsetenv cd|getenv|setenv|unsetenv"
   )

def shell_exec(command):
    proc = popen2.Popen3(command, True)
    status = proc.wait()
    results = []
    if status == 0:
        results = proc.fromchild.readlines()
    else:
        results = proc.childerr.readlines()
    return status, results
            
def shell_output(command, inchan):
    status, results = shell_exec(command)
    if status == 0:
        for line in results:
            if inchan:
                weechat.command(line.rstrip('\n'))
            else:
                weechat.prnt(line.rstrip('\n'))
    else:
        weechat.prnt("%san error occured while running command `%s'" % (SHELL_PREFIX, command))
        for line in results:
            weechat.prnt(line.rstrip('\n'))


def shell_chdir(directory):
    if directory == "":
        if os.environ.has_key('HOME'):
            directory = os.environ['HOME']
    try:
        os.chdir(directory)
    except:
        weechat.prnt("%san error occured while running command `cd %s'" % (SHELL_PREFIX, directory))
    else:
        pass

def shell_getenv(var, inchan):
    var = var.strip()
    if var == "":
        weechat.prnt("%swrong syntax, try 'getenv VAR'" % (SHELL_PREFIX))
        return
        
    value = os.getenv(var)
    if value == None:
        weechat.prnt("%s$%s is not set" % (SHELL_PREFIX, var))
    else:
        if inchan:
            weechat.command("$%s=%s" % (var, os.getenv(var)))
        else:
            weechat.prnt("%s$%s=%s" % (SHELL_PREFIX, var, os.getenv(var)))
        
def shell_setenv(expr, inchan):
    expr = expr.strip()
    lexpr = expr.split('=')
    
    if (len(lexpr) < 2):
        weechat.prnt("%swrong syntax, try 'setenv VAR=VALUE'" % (SHELL_PREFIX))
        return

    os.environ[lexpr[0].strip()] = "=".join(lexpr[1:])
    if not inchan:
        weechat.prnt("%s$%s is now set to '%s'" % (SHELL_PREFIX, lexpr[0], "=".join(lexpr[1:])))

def shell_unsetenv(var, inchan):
    var = var.strip()
    if var == "":
        weechat.prnt("%swrong syntax, try 'unsetenv VAR'" % (SHELL_PREFIX))
        return

    if os.environ.has_key(var):
        del os.environ[var]
        weechat.prnt("%s$%s is now unset" % (SHELL_PREFIX, var))
    else:
        weechat.prnt("%s$%s is not set" % (SHELL_PREFIX, var))        
    
def shell(server, args):    
    largs = args.split(" ")    

    #strip spaces
    while '' in largs:
        largs.remove('')
    while ' ' in largs:
        largs.remove(' ')

    if len(largs) ==  0:
        weechat.command("/help %s" % SHELL_CMD)
    else:
        inchan = False
        if largs[0] == '-o':
            inchan = True
            largs = largs[1:]

        if largs[0] == 'cd':
            shell_chdir(" ".join(largs[1:]), inchan)
        elif largs[0] == 'getenv':
            shell_getenv (" ".join(largs[1:]), inchan)
        elif largs[0] == 'setenv':
            shell_setenv (" ".join(largs[1:]), inchan)
        elif largs[0] == 'unsetenv':
            shell_unsetenv (" ".join(largs[1:]), inchan)
        else:
            shell_output(" ".join(largs), inchan)

    return weechat.PLUGIN_RC_OK