blob: 7281d5501718c0f93bbc76f1efe27245f9b6f869 (
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
|
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
FINAL_OUT=$(mktemp -u)
mkfifo "$FINAL_OUT"
finalOutput() {
local fileInputBuffer
while read fileInputBuffer
do
if test -f "$fileInputBuffer.err"; then
cat $fileInputBuffer.err
fi
cat $fileInputBuffer
rm -f $fileInputBuffer.err $fileInputBuffer
done
}
finalOutput < $FINAL_OUT &
readAndMark() {
local buffer
while read buffer
do
printf '%s:%s:%s\n' "$1" "$2" "$buffer"
done
}
base64decode()
{
base64 -d 2>/dev/null
}
base64encode()
{
base64 2>/dev/null
}
executeAndMark()
{
PID="$1"
INDATA="$2"
shift
shift
CMD="$@"
# LogFile
TMPFILE=$(mktemp)
# Output Streams
stdoutenc=$(mktemp -u)
stderrenc=$(mktemp -u)
mkfifo "$stdoutenc" "$stderrenc"
# app output streams
stdoutraw=$(mktemp -u)
stderrraw=$(mktemp -u)
mkfifo "$stdoutraw" "$stderrraw"
# Cleanup
trap 'rm -f "$stdoutenc" "$stderrenc" "$stdoutraw" "$stderrraw"' EXIT
# Pipe all app output through base64, and then into the output streams
cat $stdoutraw | base64encode > "$stdoutenc" &
cat $stderrraw | base64encode > "$stderrenc" &
# Mark the app's output streams
readAndMark $PID 'O' < "$stdoutenc" >> $TMPFILE &
readAndMark $PID 'E' < "$stderrenc" >> $TMPFILE.err &
# Start the app ...
if [ -z "$INDATA" ]
then
eval $CMD 1> "$stdoutraw" 2> "$stderrraw"
else
echo $INDATA | base64decode | eval "$CMD" 1> "$stdoutraw" 2> "$stderrraw"
fi
exitcode=$(echo $? | base64encode)
wait
echo "$PID:R:$exitcode" >> $TMPFILE
echo $TMPFILE
}
execute()
{
PID="$1"
if [ "$#" -lt "3" ]; then
TMPFILE=$(mktemp)
echo "$PID:R:MjU1Cg==" > $TMPFILE
echo $TMPFILE
else
INDATA=$(eval echo "$2")
shift
shift
CMD=$@
executeAndMark $PID "$INDATA" "$CMD"
fi
}
cleanup()
{
kill -- -$$
exit 1
}
trap cleanup 1 2 3 6
echo SCRIPT_INSTALLED >&2
(while read -r id inData cmd; do
if [ "$id" = "exit" ]; then
exit
fi
execute $id $inData $cmd || echo "$id:R:255" &
done) > $FINAL_OUT
|