api/cmd/imctl/audit_sinks.go

118 lines
2.6 KiB
Go

package main
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"os"
"github.com/spf13/cobra"
"gitlab.com/inetmock/inetmock/internal/format"
"gitlab.com/inetmock/inetmock/internal/rpc"
"gitlab.com/inetmock/inetmock/pkg/audit"
)
var (
listSinksCmd = &cobra.Command{
Use: "list",
Aliases: []string{"ls", "dir"},
Short: "List all subscribed sinks",
RunE: runListSinks,
}
addFileCmd = &cobra.Command{
Use: "add-file",
Aliases: []string{"add"},
Short: "subscribe events to a file",
Args: cobra.ExactArgs(1),
RunE: runAddFile,
}
removeFileCmd = &cobra.Command{
Use: "remove-file",
Aliases: []string{"rm", "del"},
Short: "remove file subscription",
Args: cobra.ExactArgs(1),
RunE: runRemoveFile,
}
readFileCmd = &cobra.Command{
Use: "read-file",
Aliases: []string{"cat"},
Short: "reads an audit file and prints the events",
Args: cobra.ExactArgs(1),
RunE: runReadFile,
}
)
type printableSink struct {
Name string
}
func runListSinks(*cobra.Command, []string) (err error) {
auditClient := rpc.NewAuditClient(conn)
ctx, cancel := context.WithTimeout(cliApp.Context(), grpcTimeout)
defer cancel()
var resp *rpc.ListSinksResponse
if resp, err = auditClient.ListSinks(ctx, &rpc.ListSinksRequest{}); err != nil {
return
}
var sinks []printableSink
for _, s := range resp.Sinks {
sinks = append(sinks, printableSink{Name: s})
}
writer := format.Writer(outputFormat, os.Stdout)
err = writer.Write(sinks)
return
}
func runAddFile(_ *cobra.Command, args []string) (err error) {
auditClient := rpc.NewAuditClient(conn)
ctx, cancel := context.WithTimeout(cliApp.Context(), grpcTimeout)
defer cancel()
_, err = auditClient.RegisterFileSink(ctx, &rpc.RegisterFileSinkRequest{TargetPath: args[0]})
return
}
func runRemoveFile(_ *cobra.Command, args []string) (err error) {
auditClient := rpc.NewAuditClient(conn)
ctx, cancel := context.WithTimeout(cliApp.Context(), grpcTimeout)
defer cancel()
_, err = auditClient.RemoveFileSink(ctx, &rpc.RemoveFileSinkRequest{TargetPath: args[0]})
return
}
func runReadFile(_ *cobra.Command, args []string) (err error) {
if len(args) != 1 {
return errors.New("expected only 1 argument")
}
var reader io.ReadCloser
if reader, err = os.Open(args[0]); err != nil {
return
}
eventReader := audit.NewEventReader(reader)
var ev audit.Event
for err == nil {
if ev, err = eventReader.Read(); err == nil {
var jsonBytes []byte
if jsonBytes, err = json.Marshal(ev); err == nil {
fmt.Println(string(jsonBytes))
}
}
}
if errors.Is(err, io.EOF) {
err = nil
}
return
}