From a1c132826cff7e9b5d34b0d6ab2f6f42d8b06d92 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 13 Jun 2023 19:46:58 +0000 Subject: [PATCH] Add the option to customize kopia cmd log level Add the option to run kopia commands with arbitrary log level values. All default log level settings remain unchanged if no option is provided. --- pkg/kopia/command/blob.go | 4 ++-- pkg/kopia/command/common.go | 16 +++++++++++----- pkg/kopia/command/const.go | 5 +++-- pkg/kopia/command/helpers.go | 2 +- pkg/kopia/command/maintenance.go | 6 +++--- pkg/kopia/command/maintenance_test.go | 20 ++++++++++++++++++++ pkg/kopia/command/policy_set_global.go | 2 +- pkg/kopia/command/repository.go | 16 ++++++++++++---- pkg/kopia/command/restore.go | 2 +- pkg/kopia/command/server.go | 12 ++++++------ pkg/kopia/command/snapshot.go | 23 +++++++++++++++-------- 11 files changed, 75 insertions(+), 33 deletions(-) diff --git a/pkg/kopia/command/blob.go b/pkg/kopia/command/blob.go index 139a1c5eaf..4e539fd305 100644 --- a/pkg/kopia/command/blob.go +++ b/pkg/kopia/command/blob.go @@ -20,7 +20,7 @@ type BlobListCommandArgs struct { // BlobList returns the kopia command for listing blobs in the repository with their sizes func BlobList(cmdArgs BlobListCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(blobSubCommand, listSubCommand) return stringSliceCommand(args) @@ -32,7 +32,7 @@ type BlobStatsCommandArgs struct { // BlobStats returns the kopia command to get the blob stats func BlobStats(cmdArgs BlobStatsCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(blobSubCommand, statsSubCommand, rawFlag) return stringSliceCommand(args) diff --git a/pkg/kopia/command/common.go b/pkg/kopia/command/common.go index 7035d46e78..6e6ecd792d 100644 --- a/pkg/kopia/command/common.go +++ b/pkg/kopia/command/common.go @@ -26,6 +26,7 @@ type CommandArgs struct { RepoPassword string ConfigFilePath string LogDirectory string + LogLevel string } func bashCommand(args logsafe.Cmd) []string { @@ -38,22 +39,27 @@ func stringSliceCommand(args logsafe.Cmd) []string { return args.StringSliceCMD() } -func commonArgs(cmdArgs *CommandArgs, requireInfoLevel bool) logsafe.Cmd { +func commonArgs(cmdArgs *CommandArgs) logsafe.Cmd { c := logsafe.NewLoggable(kopiaCommand) - if requireInfoLevel { - c = c.AppendLoggable(logLevelInfoFlag) + + if cmdArgs.LogLevel != "" { + c = c.AppendLoggableKV(logLevelFlag, cmdArgs.LogLevel) } else { - c = c.AppendLoggable(logLevelErrorFlag) + c = c.AppendLoggableKV(logLevelFlag, LogLevelError) } + if cmdArgs.ConfigFilePath != "" { c = c.AppendLoggableKV(configFileFlag, cmdArgs.ConfigFilePath) } + if cmdArgs.LogDirectory != "" { c = c.AppendLoggableKV(logDirectoryFlag, cmdArgs.LogDirectory) } + if cmdArgs.RepoPassword != "" { c = c.AppendRedactedKV(passwordFlag, cmdArgs.RepoPassword) } + return c } @@ -67,7 +73,7 @@ func addTags(tags []string, args logsafe.Cmd) logsafe.Cmd { // ExecKopiaArgs returns the basic Argv for executing kopia with the given config file path. func ExecKopiaArgs(configFilePath string) []string { - return commonArgs(&CommandArgs{ConfigFilePath: configFilePath}, false).StringSliceCMD() + return commonArgs(&CommandArgs{ConfigFilePath: configFilePath}).StringSliceCMD() } const ( diff --git a/pkg/kopia/command/const.go b/pkg/kopia/command/const.go index fab9bddfa4..8290a438b0 100644 --- a/pkg/kopia/command/const.go +++ b/pkg/kopia/command/const.go @@ -39,8 +39,9 @@ const ( globalFlag = "--global" jsonFlag = "--json" logDirectoryFlag = "--log-dir" - logLevelErrorFlag = "--log-level=error" - logLevelInfoFlag = "--log-level=info" + logLevelFlag = "--log-level" + LogLevelError = "error" + LogLevelInfo = "info" noGrpcFlag = "--no-grpc" parallelFlag = "--parallel" passwordFlag = "--password" diff --git a/pkg/kopia/command/helpers.go b/pkg/kopia/command/helpers.go index b193148848..51e32224bf 100644 --- a/pkg/kopia/command/helpers.go +++ b/pkg/kopia/command/helpers.go @@ -80,7 +80,7 @@ type GeneralCommandArgs struct { // contains subcommands, loggable flags, loggable key value pairs and // redacted key value pairs func GeneralCommand(cmdArgs GeneralCommandArgs) logsafe.Cmd { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) for _, subCmd := range cmdArgs.SubCommands { args = args.AppendLoggable(subCmd) } diff --git a/pkg/kopia/command/maintenance.go b/pkg/kopia/command/maintenance.go index 9d3c72fab1..f41ba0a850 100644 --- a/pkg/kopia/command/maintenance.go +++ b/pkg/kopia/command/maintenance.go @@ -21,7 +21,7 @@ type MaintenanceInfoCommandArgs struct { // MaintenanceInfo returns the kopia command to get maintenance info func MaintenanceInfo(cmdArgs MaintenanceInfoCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(maintenanceSubCommand, infoSubCommand) if cmdArgs.GetJsonOutput { args = args.AppendLoggable(jsonFlag) @@ -37,7 +37,7 @@ type MaintenanceSetOwnerCommandArgs struct { // MaintenanceSetOwner returns the kopia command for setting custom maintenance owner func MaintenanceSetOwner(cmdArgs MaintenanceSetOwnerCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(maintenanceSubCommand, setSubCommand) args = args.AppendLoggableKV(ownerFlag, cmdArgs.CustomOwner) return stringSliceCommand(args) @@ -49,7 +49,7 @@ type MaintenanceRunCommandArgs struct { // MaintenanceRunCommand returns the kopia command to run manual maintenance func MaintenanceRunCommand(cmdArgs MaintenanceRunCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(maintenanceSubCommand, runSubCommand) return stringSliceCommand(args) diff --git a/pkg/kopia/command/maintenance_test.go b/pkg/kopia/command/maintenance_test.go index 21b854120e..802f4103dd 100644 --- a/pkg/kopia/command/maintenance_test.go +++ b/pkg/kopia/command/maintenance_test.go @@ -74,6 +74,26 @@ func (kMaintenance *KopiaMaintenanceTestSuite) TestMaintenanceCommands(c *C) { }, expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key maintenance run", }, + { + f: func() []string { + args := MaintenanceRunCommandArgs{ + CommandArgs: commandArgs, + } + args.CommandArgs.LogLevel = LogLevelInfo + return MaintenanceRunCommand(args) + }, + expectedLog: "kopia --log-level=info --config-file=path/kopia.config --log-dir=cache/log --password=encr-key maintenance run", + }, + { + f: func() []string { + args := MaintenanceRunCommandArgs{ + CommandArgs: commandArgs, + } + args.CommandArgs.LogLevel = LogLevelError + return MaintenanceRunCommand(args) + }, + expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key maintenance run", + }, } { cmd := strings.Join(tc.f(), " ") c.Check(cmd, Equals, tc.expectedLog) diff --git a/pkg/kopia/command/policy_set_global.go b/pkg/kopia/command/policy_set_global.go index 05c987addd..6395b99ef2 100644 --- a/pkg/kopia/command/policy_set_global.go +++ b/pkg/kopia/command/policy_set_global.go @@ -23,7 +23,7 @@ type PolicySetGlobalCommandArgs struct { // PolicySetGlobal returns the kopia command for modifying the global policy func PolicySetGlobal(cmdArgs PolicySetGlobalCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(policySubCommand, setSubCommand, globalFlag) for field, val := range cmdArgs.Modifications { args = args.AppendLoggableKV(field, val) diff --git a/pkg/kopia/command/repository.go b/pkg/kopia/command/repository.go index 3cac21711b..72407d833a 100644 --- a/pkg/kopia/command/repository.go +++ b/pkg/kopia/command/repository.go @@ -40,7 +40,7 @@ type RepositoryCommandArgs struct { // RepositoryConnectCommand returns the kopia command for connecting to an existing repo func RepositoryConnectCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(repositorySubCommand, connectSubCommand, noCheckForUpdatesFlag) args = kopiaCacheArgs(args, cmdArgs.CacheDirectory, cmdArgs.ContentCacheMB, cmdArgs.MetadataCacheMB) @@ -70,7 +70,7 @@ func RepositoryConnectCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { // RepositoryCreateCommand returns the kopia command for creation of a repo func RepositoryCreateCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(repositorySubCommand, createSubCommand, noCheckForUpdatesFlag) args = kopiaCacheArgs(args, cmdArgs.CacheDirectory, cmdArgs.ContentCacheMB, cmdArgs.MetadataCacheMB) @@ -116,7 +116,7 @@ func RepositoryConnectServerCommand(cmdArgs RepositoryServerCommandArgs) []strin RepoPassword: cmdArgs.UserPassword, ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory, - }, false) + }) args = args.AppendLoggable(repositorySubCommand, connectSubCommand, serverSubCommand, noCheckForUpdatesFlag, noGrpcFlag) args = kopiaCacheArgs(args, cmdArgs.CacheDirectory, cmdArgs.ContentCacheMB, cmdArgs.MetadataCacheMB) @@ -141,7 +141,15 @@ type RepositoryStatusCommandArgs struct { // RepositoryStatusCommand returns the kopia command for checking status of the Kopia repository func RepositoryStatusCommand(cmdArgs RepositoryStatusCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, true) + // Default to info log level unless specified otherwise. + if cmdArgs.LogLevel == "" { + // Make a copy of the common command args, set the log level to info. + common := *cmdArgs.CommandArgs + common.LogLevel = LogLevelInfo + cmdArgs.CommandArgs = &common + } + + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(repositorySubCommand, statusSubCommand) return stringSliceCommand(args) } diff --git a/pkg/kopia/command/restore.go b/pkg/kopia/command/restore.go index 5908e4e19b..f600348f40 100644 --- a/pkg/kopia/command/restore.go +++ b/pkg/kopia/command/restore.go @@ -23,7 +23,7 @@ type RestoreCommandArgs struct { // Restore returns the kopia command for restoring root of a snapshot with given root ID func Restore(cmdArgs RestoreCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(restoreSubCommand, cmdArgs.RootID, cmdArgs.TargetPath) if cmdArgs.IgnorePermissionErrors { args = args.AppendLoggable(ignorePermissionsError) diff --git a/pkg/kopia/command/server.go b/pkg/kopia/command/server.go index dcdee92993..42a0f2e431 100644 --- a/pkg/kopia/command/server.go +++ b/pkg/kopia/command/server.go @@ -27,7 +27,7 @@ type ServerStartCommandArgs struct { // ServerStart returns the kopia command for starting the Kopia API Server func ServerStart(cmdArgs ServerStartCommandArgs) []string { - args := commonArgs(&CommandArgs{ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory}, false) + args := commonArgs(&CommandArgs{ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory}) if cmdArgs.AutoGenerateCert { args = args.AppendLoggable(serverSubCommand, startSubCommand, tlsGenerateCertFlag) @@ -65,7 +65,7 @@ type ServerRefreshCommandArgs struct { // ServerRefresh returns the kopia command for refreshing the Kopia API Server // This helps allow new users to be able to connect to the Server instead of waiting for auto-refresh func ServerRefresh(cmdArgs ServerRefreshCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(serverSubCommand, refreshSubCommand) args = args.AppendRedactedKV(serverCertFingerprint, cmdArgs.Fingerprint) args = args.AppendLoggableKV(addressFlag, cmdArgs.ServerAddress) @@ -85,7 +85,7 @@ type ServerStatusCommandArgs struct { // ServerStatus returns the kopia command for checking status of the Kopia API Server func ServerStatus(cmdArgs ServerStatusCommandArgs) []string { - args := commonArgs(&CommandArgs{ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory}, false) + args := commonArgs(&CommandArgs{ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory}) args = args.AppendLoggable(serverSubCommand, statusSubCommand) args = args.AppendLoggableKV(addressFlag, cmdArgs.ServerAddress) args = args.AppendRedactedKV(serverCertFingerprint, cmdArgs.Fingerprint) @@ -101,7 +101,7 @@ type ServerListUserCommmandArgs struct { // ServerListUser returns the kopia command to list users from the Kopia API Server func ServerListUser(cmdArgs ServerListUserCommmandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(serverSubCommand, userSubCommand, listSubCommand, jsonFlag) return stringSliceCommand(args) @@ -115,7 +115,7 @@ type ServerSetUserCommandArgs struct { // ServerSetUser returns the kopia command setting password for existing user for the Kopia API Server func ServerSetUser(cmdArgs ServerSetUserCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(serverSubCommand, userSubCommand, setSubCommand, cmdArgs.NewUsername) args = args.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) @@ -130,7 +130,7 @@ type ServerAddUserCommandArgs struct { // ServerAddUser returns the kopia command adding a new user to the Kopia API Server func ServerAddUser(cmdArgs ServerAddUserCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(serverSubCommand, userSubCommand, addSubCommand, cmdArgs.NewUsername) args = args.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) diff --git a/pkg/kopia/command/snapshot.go b/pkg/kopia/command/snapshot.go index ccbcc7f3f6..53a0f85d8b 100644 --- a/pkg/kopia/command/snapshot.go +++ b/pkg/kopia/command/snapshot.go @@ -22,7 +22,6 @@ import ( ) const ( - requireLogLevelInfo = true manifestTypeSnapshotFilter = "type:snapshot" ) @@ -36,8 +35,16 @@ type SnapshotCreateCommandArgs struct { // SnapshotCreate returns the kopia command for creation of a snapshot func SnapshotCreate(cmdArgs SnapshotCreateCommandArgs) []string { + // Default to info log level unless specified otherwise. + if cmdArgs.LogLevel == "" { + // Make a copy of the common command args, set the log level to info. + common := *cmdArgs.CommandArgs + common.LogLevel = LogLevelInfo + cmdArgs.CommandArgs = &common + } + parallelismStr := strconv.Itoa(cmdArgs.Parallelism) - args := commonArgs(cmdArgs.CommandArgs, requireLogLevelInfo) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(snapshotSubCommand, createSubCommand, cmdArgs.PathToBackup, jsonFlag) args = args.AppendLoggableKV(parallelFlag, parallelismStr) args = addTags(cmdArgs.Tags, args) @@ -63,7 +70,7 @@ type SnapshotRestoreCommandArgs struct { // SnapshotRestore returns kopia command restoring snapshots with given snap ID func SnapshotRestore(cmdArgs SnapshotRestoreCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(snapshotSubCommand, restoreSubCommand, cmdArgs.SnapID, cmdArgs.TargetPath) if cmdArgs.IgnorePermissionErrors { args = args.AppendLoggable(ignorePermissionsError) @@ -84,7 +91,7 @@ type SnapshotDeleteCommandArgs struct { // SnapshotDelete returns the kopia command for deleting a snapshot with given snapshot ID func SnapshotDelete(cmdArgs SnapshotDeleteCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(snapshotSubCommand, deleteSubCommand, cmdArgs.SnapID, unsafeIgnoreSourceFlag) return stringSliceCommand(args) @@ -98,7 +105,7 @@ type SnapshotExpireCommandArgs struct { // SnapshotExpire returns the kopia command for removing snapshots with given root ID func SnapshotExpire(cmdArgs SnapshotExpireCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(snapshotSubCommand, expireSubCommand, cmdArgs.RootID) if cmdArgs.MustDelete { args = args.AppendLoggable(deleteFlag) @@ -113,7 +120,7 @@ type SnapListAllCommandArgs struct { // SnapListAll returns the kopia command for listing all snapshots in the repository with their sizes func SnapListAll(cmdArgs SnapListAllCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable( snapshotSubCommand, listSubCommand, @@ -132,7 +139,7 @@ type SnapListAllWithSnapIDsCommandArgs struct { // SnapListAllWithSnapIDs returns the kopia command for listing all snapshots in the repository with snapshotIDs func SnapListAllWithSnapIDs(cmdArgs SnapListAllWithSnapIDsCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable(manifestSubCommand, listSubCommand, jsonFlag) args = args.AppendLoggableKV(filterFlag, manifestTypeSnapshotFilter) @@ -145,7 +152,7 @@ type SnapListByTagsCommandArgs struct { } func SnapListByTags(cmdArgs SnapListByTagsCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs, false) + args := commonArgs(cmdArgs.CommandArgs) args = args.AppendLoggable( snapshotSubCommand, listSubCommand,