package file import ( "fmt" "os" "path/filepath" "sync" "github.com/hashicorp/vault/audit" "github.com/hashicorp/vault/logical" ) func Factory(conf map[string]string) (audit.Backend, error) { path, ok := conf["path"] if !ok { return nil, fmt.Errorf("path is required") } return &Backend{Path: path}, nil } // Backend is the audit backend for the file-based audit store. // // NOTE: This audit backend is currently very simple: it appends to a file. // It doesn't do anything more at the moment to assist with rotation // or reset the write cursor, this should be done in the future. type Backend struct { Path string once sync.Once f *os.File } func (b *Backend) LogRequest(auth *logical.Auth, req *logical.Request) error { if err := b.open(); err != nil { return err } var format audit.FormatJSON return format.FormatRequest(b.f, auth, req) } func (b *Backend) LogResponse( auth *logical.Auth, req *logical.Request, resp *logical.Response, err error) error { if err := b.open(); err != nil { return err } var format audit.FormatJSON return format.FormatResponse(b.f, auth, req, resp, err) } func (b *Backend) open() error { if b.f != nil { return nil } if err := os.MkdirAll(filepath.Dir(b.Path), 0600); err != nil { return err } var err error b.f, err = os.OpenFile(b.Path, os.O_APPEND|os.O_WRONLY, 0600) if err != nil { return err } return nil }