-
Notifications
You must be signed in to change notification settings - Fork 8
/
main.go
111 lines (95 loc) · 2.17 KB
/
main.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"bytes"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"github.com/cascades-fbp/cascades/components/utils"
"github.com/cascades-fbp/cascades/runtime"
zmq "github.com/pebbe/zmq4"
)
var (
// flags
cmdEndpoint = flag.String("port.cmd", "", "Component's options port endpoint")
outputEndpoint = flag.String("port.out", "", "Component's output port endpoint")
errorEndpoint = flag.String("port.err", "", "Component's output port endpoint")
jsonFlag = flag.Bool("json", false, "Print component documentation in JSON")
debug = flag.Bool("debug", false, "Enable debug mode")
// Internal
cmdPort, outPort, errPort *zmq.Socket
err error
)
func validateArgs() {
if *cmdEndpoint == "" {
flag.Usage()
os.Exit(1)
}
}
func openPorts() {
cmdPort, err = utils.CreateInputPort(*cmdEndpoint)
utils.AssertError(err)
if *outputEndpoint != "" {
outPort, err = utils.CreateOutputPort(*outputEndpoint)
utils.AssertError(err)
}
if *errorEndpoint != "" {
errPort, err = utils.CreateOutputPort(*errorEndpoint)
utils.AssertError(err)
}
}
func closePorts() {
cmdPort.Close()
if outPort != nil {
outPort.Close()
}
if errPort != nil {
errPort.Close()
}
zmq.Term()
}
func main() {
flag.Parse()
if *jsonFlag {
doc, _ := registryEntry.JSON()
fmt.Println(string(doc))
os.Exit(0)
}
log.SetFlags(0)
if *debug {
log.SetOutput(os.Stdout)
} else {
log.SetOutput(ioutil.Discard)
}
validateArgs()
openPorts()
defer closePorts()
ch := utils.HandleInterruption()
err = runtime.SetupShutdownByDisconnect(cmdPort, "exec.cmd", ch)
utils.AssertError(err)
log.Println("Started...")
for {
ip, err := cmdPort.RecvMessageBytes(0)
if err != nil {
log.Println("Error receiving message:", err.Error())
continue
}
if !runtime.IsValidIP(ip) {
continue
}
out, err := executeCommand(string(ip[1]))
if err != nil {
log.Println(err.Error())
if errPort != nil {
errPort.SendMessage(runtime.NewPacket([]byte(err.Error())))
}
continue
}
out = bytes.Replace(out, []byte("\n"), []byte(""), -1)
log.Println(string(out))
if outPort != nil {
outPort.SendMessage(runtime.NewPacket(out))
}
}
}