119 lines
2.6 KiB
Go
119 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
|
||
|
}
|