File: gce-serial-output-continuously-append.sh

package info (click to toggle)
snapd 2.71-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 79,536 kB
  • sloc: ansic: 16,114; sh: 16,105; python: 9,941; makefile: 1,890; exp: 190; awk: 40; xml: 22
file content (70 lines) | stat: -rwxr-xr-x 2,321 bytes parent folder | download | duplicates (3)
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
#!/bin/bash -e

INSTANCE="$1"

if [ -z "$INSTANCE" ]; then
    echo "first argument must be the GCE instance (for example, mar280632-365378)"
    exit 1
fi

# wait for the instance to exist
until gcloud compute --project=snapd-spread instances describe "$INSTANCE" --zone=us-east1-b >/dev/null 2>&1; do 
    echo "waiting for instance to exist"
    sleep 1
done

OUTPUT_FILE="console-output-$INSTANCE.txt"

backgroundscript=$(mktemp --suffix=.gce-watcher)
cat >> "$backgroundscript" << 'EOF'
INSTANCE="$1"
OUTPUT_FILE="$2"
next=0
truncate -s0 "$OUTPUT_FILE"
while true; do
    # The get-serial-port-output command will print on the stdout the new lines
    # that the machine emitted on the serial console since the last time it was
    # queried. The bookmark is the number ("$next") that we pass with the
    # --start parameter; this number is printed by gcloud to the stderr in this
    # form:
    #
    #   Specify --start=130061 in the next get-serial-port-output invocation to get only the new output starting from here.
    #
    # In the subshell below we compute the value of the "$next" variable: we
    # store the original stdout into the console-output-bits.txt file, then
    # (via a third file descriptor, not to mess with the original stdout) we
    # redirect the stderr into the stdout and use "grep" to extract the
    # suggested value for the --start parameter.
    next=$(
        gcloud compute \
            --project=snapd-spread \
            instances get-serial-port-output "$INSTANCE" \
            --start="$next" \
            --zone=us-east1-b 3>&1 1>"${OUTPUT_FILE}-bits.txt" 2>&3- | grep -Po -- '--start=\K[0-9]+')
    trimmedConsoleSnippet="$(sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' < ${OUTPUT_FILE}-bits.txt)"
    if [ -n "$trimmedConsoleSnippet" ]; then
        echo "$trimmedConsoleSnippet" >> "$OUTPUT_FILE"
    fi
    sleep 1
done
EOF

# start collecting the console output
bash "$backgroundscript" "$INSTANCE" "$OUTPUT_FILE" &

on_exit() {
    # Restore the signal handlers to avoid recursion
    trap - INT TERM QUIT EXIT
    rm -f "$OUTPUT_FILE" "$OUTPUT_FILE-bits.txt"
    # kill all processes in this group
    kill 0
}
trap "on_exit" INT TERM QUIT EXIT

# wait for it to appear
until [ -f "$OUTPUT_FILE" ]; do
    sleep 1
done

# watch it
tail -f "$OUTPUT_FILE"