mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-03-25 23:30:41 +01:00
This commit adds a new `ctrld log tail` subcommand that streams runtime debug logs to the terminal in real-time, similar to `tail -f`. Changes: - log_writer.go: Add Subscribe/tailLastLines for fan-out to tail clients - control_server.go: Add /log/tail endpoint with streaming response - Internal logging: subscribes to logWriter for live data - File-based logging: polls log file for new data (200ms interval) - Sends last N lines as initial context on connect - commands.go: Add `log tail` cobra subcommand with --lines/-n flag - control_client.go: Add postStream() with no timeout for long-lived connections Usage: sudo ctrld log tail # shows last 10 lines then follows sudo ctrld log tail -n 50 # shows last 50 lines then follows Ctrl+C to stop
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
type controlClient struct {
|
|
c *http.Client
|
|
}
|
|
|
|
func newControlClient(addr string) *controlClient {
|
|
return &controlClient{c: &http.Client{
|
|
Transport: &http.Transport{
|
|
DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
|
|
d := net.Dialer{}
|
|
return d.DialContext(ctx, "unix", addr)
|
|
},
|
|
},
|
|
Timeout: time.Second * 30,
|
|
}}
|
|
}
|
|
|
|
func (c *controlClient) post(path string, data io.Reader) (*http.Response, error) {
|
|
// for log/send, set the timeout to 5 minutes
|
|
if path == sendLogsPath {
|
|
c.c.Timeout = time.Minute * 5
|
|
}
|
|
return c.c.Post("http://unix"+path, contentTypeJson, data)
|
|
}
|
|
|
|
// postStream sends a POST request with no timeout, suitable for long-lived streaming connections.
|
|
func (c *controlClient) postStream(path string, data io.Reader) (*http.Response, error) {
|
|
c.c.Timeout = 0
|
|
return c.c.Post("http://unix"+path, contentTypeJson, data)
|
|
}
|
|
|
|
// deactivationRequest represents request for validating deactivation pin.
|
|
type deactivationRequest struct {
|
|
Pin int64 `json:"pin"`
|
|
}
|