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,