-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
89 lines (74 loc) · 1.81 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
package main
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
)
const manifestStartToken = "DirectorJobRunner: Manifest:"
func main() {
manifest, err := extractManifest()
if err != nil {
fmt.Printf("ERROR: %v\n", err)
os.Exit(1)
}
fmt.Print(manifest)
}
func extractManifest() (string, error) {
debugBuf := new(bytes.Buffer)
_, err := io.Copy(debugBuf, os.Stdin)
if err != nil {
return "", fmt.Errorf("failed to copy manifest from stdin: %v", err)
}
manifestBuf := new(bytes.Buffer)
err = seekToManifest(debugBuf)
if err != nil {
return "", fmt.Errorf("failed to find beginning of manifest in debug log: %v", err)
}
err = collectManifest(manifestBuf, *debugBuf)
if err != nil {
return "", fmt.Errorf("failed to retrieve manifest from debug log: %v", err)
}
manifest, err := ioutil.ReadAll(manifestBuf)
if err != nil {
return "", fmt.Errorf("unexpected error: %v", err)
}
return string(manifest), nil
}
func seekToManifest(buf *bytes.Buffer) error {
for {
rawLine, err := buf.ReadBytes(byte('\n'))
switch err {
case nil:
if strings.Contains(string(rawLine), manifestStartToken) {
return nil
}
case io.EOF:
return fmt.Errorf(`could not find %s`, manifestStartToken)
default:
return fmt.Errorf("unexpected error: %v", err)
}
}
}
func collectManifest(dst *bytes.Buffer, debugBuf bytes.Buffer) error {
for {
rawLine, err := debugBuf.ReadBytes(byte('\n'))
switch err {
case nil:
line := string(rawLine)
if strings.Contains(line, "D, ") || strings.Contains(line, "I, ") {
return nil
}
_, err := dst.Write(rawLine)
if err != nil {
return fmt.Errorf("unexpected error: %v", err)
}
case io.EOF:
return fmt.Errorf("reached end of log before finding end of manifest")
default:
return fmt.Errorf("unexpected error: %v", err)
}
}
}