forked from uprtdev/labean
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtasks.go
97 lines (83 loc) · 3.08 KB
/
tasks.go
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
// Copyright (c) 2018, Kirill Ovchinnikov
// All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package main
import (
"bytes"
"os/exec"
"strings"
"syscall"
)
type task struct {
ID string `json:"name"`
TurnOn string `json:"on_command"`
TurnOff string `json:"off_command"`
Timeout uint16 `json:"timeout"`
}
type taskResult struct {
Command string `json:"commandLine"`
Retcode int `json:"returnCode"`
Err string `json:"error,omitempty"`
StdErr string `json:"stderr,omitempty"`
StdOut string `json:"stdout,omitempty"`
Timeout uint16 `json:"timeoutInSeconds,omitempty"`
}
func prepareCommand(ip string, ServerIP string, cmd string) string {
s := strings.Replace(cmd, "{clientIP}", ip, -1)
s = strings.Replace(s, "{ServerIP}", ServerIP, -1)
return s
}
func runTask(cmd string) taskResult {
var outbuf, errbuf bytes.Buffer
var result taskResult
result.Command = cmd
args := strings.Fields(cmd)
command := exec.Command(args[0], args[1:]...)
command.Stdout = &outbuf
command.Stderr = &errbuf
err := command.Run()
result.StdErr = errbuf.String()
result.StdOut = outbuf.String()
if err != nil {
result.Retcode = -1
result.Err = err.Error()
}
if exitError, ok := err.(*exec.ExitError); ok {
result.Retcode = exitError.Sys().(syscall.WaitStatus).ExitStatus()
}
return result
}
func (c task) Start(env *state, ip string) *taskResult {
cmd := prepareCommand(ip, env.config.ServerIP, c.TurnOn)
result := runTask(cmd)
result.Timeout = c.Timeout
if result.Retcode == 0 && c.Timeout != 0 {
cmd := prepareCommand(ip, env.config.ServerIP, c.TurnOff)
env.monitor.ScheduleTaskToStop(cmd, c.Timeout)
}
return &result
}
func (c task) Stop(env *state, ip string) *taskResult {
cmd := prepareCommand(ip, env.config.ServerIP, c.TurnOff)
result := runTask(cmd)
if result.Retcode == 0 {
env.monitor.CancelTask(cmd)
}
return &result
}