Skip to content

Commit 6fa388d

Browse files
author
urso
committed
Backport: Check stdout being available in console output
1 parent 9601efe commit 6fa388d

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

CHANGELOG.asciidoc

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ https://github.com/elastic/beats/compare/v1.2.3...v1.3.0[View commits]
7373
- Fix output modes backoff counter reset. {issue}1803[1803] {pull}1814[1814] {pull}1818[1818]
7474
- Set logstash output default bulk_max_size to 2048. {issue}1662[1662]
7575
- Seed random number generator using crypto.rand package. {pull}1503[1503]
76+
- Check stdout being available when console output is configured. {issue}2063[2063]
7677
7778
*Packetbeat*
7879

libbeat/outputs/console/console.go

+26-17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package console
22

33
import (
44
"encoding/json"
5+
"fmt"
56
"os"
67

78
"github.com/elastic/beats/libbeat/common"
@@ -20,28 +21,23 @@ func (p plugin) NewOutput(
2021
topologyExpire int,
2122
) (outputs.Outputer, error) {
2223
pretty := config.Pretty != nil && *config.Pretty
23-
return newConsole(pretty), nil
24+
c := newConsole(pretty)
25+
26+
// check stdout actually being available
27+
if _, err := c.out.Stat(); err != nil {
28+
return nil, fmt.Errorf("console output initialization failed with: %v", err)
29+
}
30+
31+
return c, nil
2432
}
2533

2634
type console struct {
2735
pretty bool
36+
out *os.File
2837
}
2938

3039
func newConsole(pretty bool) *console {
31-
return &console{pretty}
32-
}
33-
34-
func writeBuffer(buf []byte) error {
35-
written := 0
36-
for written < len(buf) {
37-
n, err := os.Stdout.Write(buf[written:])
38-
if err != nil {
39-
return err
40-
}
41-
42-
written += n
43-
}
44-
return nil
40+
return &console{pretty: pretty, out: os.Stdout}
4541
}
4642

4743
func (c *console) PublishEvent(
@@ -63,10 +59,10 @@ func (c *console) PublishEvent(
6359
return err
6460
}
6561

66-
if err = writeBuffer(jsonEvent); err != nil {
62+
if err = c.writeBuffer(jsonEvent); err != nil {
6763
goto fail
6864
}
69-
if err = writeBuffer([]byte{'\n'}); err != nil {
65+
if err = c.writeBuffer([]byte{'\n'}); err != nil {
7066
goto fail
7167
}
7268

@@ -79,3 +75,16 @@ fail:
7975
outputs.SignalFailed(s, err)
8076
return err
8177
}
78+
79+
func (c *console) writeBuffer(buf []byte) error {
80+
written := 0
81+
for written < len(buf) {
82+
n, err := c.out.Write(buf[written:])
83+
if err != nil {
84+
return err
85+
}
86+
87+
written += n
88+
}
89+
return nil
90+
}

libbeat/outputs/console/console_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,31 @@ func event(k, v string) common.MapStr {
4444
return common.MapStr{k: v}
4545
}
4646

47-
func run(c *console, events ...common.MapStr) (string, error) {
47+
func run(pretty bool, events ...common.MapStr) (string, error) {
4848
return withStdout(func() {
49+
c := newConsole(pretty)
4950
for _, event := range events {
5051
c.PublishEvent(nil, outputs.Options{}, event)
5152
}
5253
})
5354
}
5455

5556
func TestConsoleOneEvent(t *testing.T) {
56-
lines, err := run(newConsole(false), event("event", "myevent"))
57+
lines, err := run(false, event("event", "myevent"))
5758
assert.Nil(t, err)
5859
expected := "{\"event\":\"myevent\"}\n"
5960
assert.Equal(t, expected, lines)
6061
}
6162

6263
func TestConsoleOneEventIndented(t *testing.T) {
63-
lines, err := run(newConsole(true), event("event", "myevent"))
64+
lines, err := run(true, event("event", "myevent"))
6465
assert.Nil(t, err)
6566
expected := "{\n \"event\": \"myevent\"\n}\n"
6667
assert.Equal(t, expected, lines)
6768
}
6869

6970
func TestConsoleMultipleEvents(t *testing.T) {
70-
lines, err := run(newConsole(false),
71+
lines, err := run(false,
7172
event("event", "event1"),
7273
event("event", "event2"),
7374
event("event", "event3"),
@@ -79,7 +80,7 @@ func TestConsoleMultipleEvents(t *testing.T) {
7980
}
8081

8182
func TestConsoleMultipleEventsIndented(t *testing.T) {
82-
lines, err := run(newConsole(true),
83+
lines, err := run(true,
8384
event("event", "event1"),
8485
event("event", "event2"),
8586
event("event", "event3"),

0 commit comments

Comments
 (0)