optimize audit logging

pull/14596/head
Steven Powell 2022-07-15 13:07:49 -07:00
parent a433bded09
commit 709cd5812c
4 changed files with 27 additions and 20 deletions

View File

@ -90,7 +90,13 @@ func LogCommandEnd(id string) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to convert logs to rows: %v", err) return fmt.Errorf("failed to convert logs to rows: %v", err)
} }
auditContents := "" // have to truncate the audit log while closed as Windows can't truncate an open file
if err := os.Truncate(localpath.AuditLog(), 0); err != nil {
return fmt.Errorf("failed to truncate audit log: %v", err)
}
if err := openAuditLog(); err != nil {
return err
}
var entriesNeedsToUpdate int var entriesNeedsToUpdate int
for _, v := range rowSlice { for _, v := range rowSlice {
if v.id == id { if v.id == id {
@ -102,21 +108,13 @@ func LogCommandEnd(id string) error {
if err != nil { if err != nil {
return err return err
} }
auditContents += string(auditLog) + "\n" if _, err = currentLogFile.WriteString(string(auditLog) + "\n"); err != nil {
return fmt.Errorf("failed to write to audit log: %v", err)
}
} }
if entriesNeedsToUpdate == 0 { if entriesNeedsToUpdate == 0 {
return fmt.Errorf("failed to find a log row with id equals to %v", id) return fmt.Errorf("failed to find a log row with id equals to %v", id)
} }
// have to truncate the audit log while closed as Windows can't truncate an open file
if err := os.Truncate(localpath.AuditLog(), 0); err != nil {
return fmt.Errorf("failed to truncate audit log: %v", err)
}
if err := openAuditLog(); err != nil {
return err
}
if _, err = currentLogFile.Write([]byte(auditContents)); err != nil {
return fmt.Errorf("failed to write to audit log: %v", err)
}
return nil return nil
} }

View File

@ -30,6 +30,10 @@ var currentLogFile *os.File
// openAuditLog opens the audit log file or creates it if it doesn't exist. // openAuditLog opens the audit log file or creates it if it doesn't exist.
func openAuditLog() error { func openAuditLog() error {
// this is so we can manually set the log file for tests
if currentLogFile != nil {
return nil
}
lp := localpath.AuditLog() lp := localpath.AuditLog()
f, err := os.OpenFile(lp, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) f, err := os.OpenFile(lp, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
if err != nil { if err != nil {
@ -44,6 +48,7 @@ func closeAuditLog() {
if err := currentLogFile.Close(); err != nil { if err := currentLogFile.Close(); err != nil {
klog.Errorf("failed to close the audit log: %v", err) klog.Errorf("failed to close the audit log: %v", err)
} }
currentLogFile = nil
} }
// appendToLog appends the row to the log file. // appendToLog appends the row to the log file.

View File

@ -36,27 +36,30 @@ func TestLogFile(t *testing.T) {
if err := openAuditLog(); err != nil { if err := openAuditLog(); err != nil {
t.Fatal(err) t.Fatal(err)
} }
closeAuditLog()
}) })
t.Run("AppendToLog", func(t *testing.T) { t.Run("AppendToLog", func(t *testing.T) {
defer closeAuditLog()
f, err := os.CreateTemp("", "audit.json") f, err := os.CreateTemp("", "audit.json")
if err != nil { if err != nil {
t.Fatalf("Error creating temporary file: %v", err) t.Fatalf("Error creating temporary file: %v", err)
} }
defer os.Remove(f.Name()) defer os.Remove(f.Name())
oldLogFile := *currentLogFile
defer func() { currentLogFile = &oldLogFile }()
currentLogFile = f currentLogFile = f
defer closeAuditLog()
r := newRow("start", "-v", "user1", "v0.17.1", time.Now(), uuid.New().String()) r := newRow("start", "-v", "user1", "v0.17.1", time.Now(), uuid.New().String())
if err := appendToLog(r); err != nil { if err := appendToLog(r); err != nil {
t.Fatalf("Error appendingToLog: %v", err) t.Fatalf("Error appendingToLog: %v", err)
} }
currentLogFile, err = os.Open(f.Name())
if err != nil {
t.Fatal(err)
}
b := make([]byte, 100) b := make([]byte, 100)
if _, err := f.Read(b); err != nil && err != io.EOF { if _, err := currentLogFile.Read(b); err != nil && err != io.EOF {
t.Errorf("Log was not appended to file: %v", err) t.Errorf("Log was not appended to file: %v", err)
} }
}) })

View File

@ -17,6 +17,7 @@ limitations under the License.
package audit package audit
import ( import (
"io"
"os" "os"
"testing" "testing"
) )
@ -30,18 +31,18 @@ func TestReport(t *testing.T) {
s := `{"data":{"args":"-p mini1","command":"start","endTime":"Wed, 03 Feb 2021 15:33:05 MST","profile":"mini1","startTime":"Wed, 03 Feb 2021 15:30:33 MST","user":"user1"},"datacontenttype":"application/json","id":"9b7593cb-fbec-49e5-a3ce-bdc2d0bfb208","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.si gs.minikube.audit"} s := `{"data":{"args":"-p mini1","command":"start","endTime":"Wed, 03 Feb 2021 15:33:05 MST","profile":"mini1","startTime":"Wed, 03 Feb 2021 15:30:33 MST","user":"user1"},"datacontenttype":"application/json","id":"9b7593cb-fbec-49e5-a3ce-bdc2d0bfb208","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.si gs.minikube.audit"}
{"data":{"args":"-p mini1","command":"start","endTime":"Wed, 03 Feb 2021 15:33:05 MST","profile":"mini1","startTime":"Wed, 03 Feb 2021 15:30:33 MST","user":"user1"},"datacontenttype":"application/json","id":"9b7593cb-fbec-49e5-a3ce-bdc2d0bfb208","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.si gs.minikube.audit"} {"data":{"args":"-p mini1","command":"start","endTime":"Wed, 03 Feb 2021 15:33:05 MST","profile":"mini1","startTime":"Wed, 03 Feb 2021 15:30:33 MST","user":"user1"},"datacontenttype":"application/json","id":"9b7593cb-fbec-49e5-a3ce-bdc2d0bfb208","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.si gs.minikube.audit"}
{"data":{"args":"--user user2","command":"logs","endTime":"Tue, 02 Feb 2021 16:46:20 MST","profile":"minikube","startTime":"Tue, 02 Feb 2021 16:46:00 MST","user":"user2"},"datacontenttype":"application/json","id":"fec03227-2484-48b6-880a-88fd010b5efd","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.sigs.minikube.audit"}` {"data":{"args":"--user user2","command":"logs","endTime":"Tue, 02 Feb 2021 16:46:20 MST","profile":"minikube","startTime":"Tue, 02 Feb 2021 16:46:00 MST","user":"user2"},"datacontenttype":"application/json","id":"fec03227-2484-48b6-880a-88fd010b5efd","source":"https://minikube.sigs.k8s.io/","specversion":"1.0","type":"io.k8s.sigs.minikube.audit"}
`
if _, err := f.WriteString(s); err != nil { if _, err := f.WriteString(s); err != nil {
t.Fatalf("failed writing to file: %v", err) t.Fatalf("failed writing to file: %v", err)
} }
if _, err := f.Seek(0, 0); err != nil { if _, err := f.Seek(0, io.SeekStart); err != nil {
t.Fatalf("failed seeking to start of file: %v", err) t.Fatalf("failed seeking to start of file: %v", err)
} }
oldLogFile := *currentLogFile
defer func() { currentLogFile = &oldLogFile }()
currentLogFile = f currentLogFile = f
defer closeAuditLog()
wantedLines := 2 wantedLines := 2
r, err := Report(wantedLines) r, err := Report(wantedLines)