@@ -17,15 +17,20 @@ limitations under the License.
17
17
package audit
18
18
19
19
import (
20
+ "bufio"
21
+ "encoding/json"
22
+ "fmt"
20
23
"os"
21
24
"os/user"
22
25
"strings"
23
26
"time"
24
27
28
+ "github.com/google/uuid"
25
29
"github.com/spf13/pflag"
26
30
"github.com/spf13/viper"
27
- "k8s.io/klog/v2"
28
31
"k8s.io/minikube/pkg/minikube/config"
32
+ "k8s.io/minikube/pkg/minikube/constants"
33
+ "k8s.io/minikube/pkg/minikube/localpath"
29
34
"k8s.io/minikube/pkg/version"
30
35
)
31
36
@@ -52,14 +57,67 @@ func args() string {
52
57
}
53
58
54
59
// Log details about the executed command.
55
- func Log ( startTime time. Time ) {
56
- if ! shouldLog () {
57
- return
60
+ func LogCommandStart () ( string , error ) {
61
+ if len ( os . Args ) < 2 || ! shouldLog () {
62
+ return "" , nil
58
63
}
59
- r := newRow (pflag .Arg (0 ), args (), userName (), version .GetVersion (), startTime , time .Now ())
64
+ id := uuid .New ().String ()
65
+ r := newRow (pflag .Arg (0 ), args (), userName (), version .GetVersion (), time .Now (), id )
60
66
if err := appendToLog (r ); err != nil {
61
- klog . Warning ( err )
67
+ return "" , err
62
68
}
69
+ return r .id , nil
70
+ }
71
+
72
+ func LogCommandEnd (id string ) error {
73
+ if id == "" {
74
+ return nil
75
+ }
76
+ if err := openAuditLog (); err != nil {
77
+ return err
78
+ }
79
+ defer closeAuditLog ()
80
+ var logs []string
81
+ s := bufio .NewScanner (currentLogFile )
82
+ for s .Scan () {
83
+ logs = append (logs , s .Text ())
84
+ }
85
+ if err := s .Err (); err != nil {
86
+ return fmt .Errorf ("failed to read from audit file: %v" , err )
87
+ }
88
+ closeAuditLog ()
89
+ rowSlice , err := logsToRows (logs )
90
+ if err != nil {
91
+ return fmt .Errorf ("failed to convert logs to rows: %v" , err )
92
+ }
93
+ auditContents := ""
94
+ var entriesNeedsToUpdate int
95
+ for _ , v := range rowSlice {
96
+ if v .id == id {
97
+ v .endTime = time .Now ().Format (constants .TimeFormat )
98
+ v .Data = v .toMap ()
99
+ entriesNeedsToUpdate ++
100
+ }
101
+ auditLog , err := json .Marshal (v )
102
+ if err != nil {
103
+ return err
104
+ }
105
+ auditContents += string (auditLog ) + "\n "
106
+ }
107
+ if entriesNeedsToUpdate == 0 {
108
+ return fmt .Errorf ("failed to find a log row with id equals to %v" , id )
109
+ }
110
+ // have to truncate the audit log while closed as Windows can't truncate an open file
111
+ if err := os .Truncate (localpath .AuditLog (), 0 ); err != nil {
112
+ return fmt .Errorf ("failed to truncate audit log: %v" , err )
113
+ }
114
+ if err := openAuditLog (); err != nil {
115
+ return err
116
+ }
117
+ if _ , err = currentLogFile .Write ([]byte (auditContents )); err != nil {
118
+ return fmt .Errorf ("failed to write to audit log: %v" , err )
119
+ }
120
+ return nil
63
121
}
64
122
65
123
// shouldLog returns if the command should be logged.
@@ -74,7 +132,7 @@ func shouldLog() bool {
74
132
}
75
133
76
134
// commands that should not be logged.
77
- no := []string {"status" , "version" }
135
+ no := []string {"status" , "version" , "logs" , "generate-docs" }
78
136
a := pflag .Arg (0 )
79
137
for _ , c := range no {
80
138
if a == c {
0 commit comments