vault/builtin/audit/file/backend.go

72 lines
1.4 KiB
Go

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
}