blob: 482bc1de7fcc0cdddf0d6a08ae0f1cbd847908f1 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package botanist
import (
"context"
"io"
"golang.org/x/crypto/ssh"
"go.fuchsia.dev/tools/runner"
)
// The program on fuchsia used to stream system logs through a shell, not to be confused
// with the zircon host tool "loglistener" (no underscore) used to zircon-level logs to host.
const logListener = "bin/log_listener"
// Syslogger represents an session with a Fuchsia instance through which system logs may be streamed.
type Syslogger struct {
r *runner.SSHRunner
}
// NewSyslogger creates a new Syslogger, given an SSH session with a Fuchsia instance.
func NewSyslogger(client *ssh.Client) (*Syslogger, error) {
session, err := client.NewSession()
if err != nil {
return nil, err
}
return &Syslogger{r: &runner.SSHRunner{Session: session}}, nil
}
// Stream writes system logs to a given writer; it blocks until the stream is
// is terminated or a Done is signaled.
func (s *Syslogger) Stream(ctx context.Context, output io.Writer) error {
// Note: Fuchsia's log_listener does not write to stderr.
return s.r.Run(ctx, []string{logListener}, output, nil)
}
// Close tidies up the system logging session with the corresponding fuchsia instance.
func (s *Syslogger) Close() error {
s.r.Session.Signal(ssh.SIGKILL)
return s.r.Session.Close()
}