mirror of
https://github.com/minio/mc.git
synced 2025-11-10 13:42:32 +03:00
162 lines
4.5 KiB
Go
162 lines
4.5 KiB
Go
/*
|
|
* MinIO Client (C) 2017 MinIO, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"github.com/fatih/color"
|
|
"github.com/minio/cli"
|
|
json "github.com/minio/mc/pkg/colorjson"
|
|
"github.com/minio/mc/pkg/console"
|
|
"github.com/minio/mc/pkg/probe"
|
|
)
|
|
|
|
var sessionClearFlags = []cli.Flag{
|
|
cli.BoolFlag{
|
|
Name: "force",
|
|
Usage: "force a dangerous clear operation.",
|
|
},
|
|
}
|
|
|
|
var sessionClear = cli.Command{
|
|
Name: "clear",
|
|
Usage: "clear interrupted session",
|
|
Action: mainSessionClear,
|
|
Before: setGlobalsFromContext,
|
|
Flags: append(sessionClearFlags, globalFlags...),
|
|
HideHelpCommand: true,
|
|
CustomHelpTemplate: `NAME:
|
|
{{.HelpName}} - {{.Usage}}
|
|
|
|
USAGE:
|
|
{{.HelpName}} SESSION-ID|all
|
|
|
|
SESSION-ID:
|
|
SESSION - Session can either be $SESSION-ID or all
|
|
|
|
FLAGS:
|
|
{{range .VisibleFlags}}{{.}}
|
|
{{end}}
|
|
EXAMPLES:
|
|
1. Clear session.
|
|
$ {{.HelpName}} ygVIpSJs
|
|
|
|
2. Clear all sessions.
|
|
$ {{.HelpName}} all
|
|
|
|
3. Forcefully clear an obsolete session.
|
|
$ {{.HelpName}} ygVIpSJs --force
|
|
`,
|
|
}
|
|
|
|
// clearSessionMessage container for clearing session messages.
|
|
type clearSessionMessage struct {
|
|
Status string `json:"success"`
|
|
SessionID string `json:"sessionId"`
|
|
}
|
|
|
|
// String colorized clear session message.
|
|
func (c clearSessionMessage) String() string {
|
|
msg := "Session `" + c.SessionID + "`"
|
|
var colorizedMsg string
|
|
switch c.Status {
|
|
case "success":
|
|
colorizedMsg = console.Colorize("ClearSession", msg+" cleared successfully.")
|
|
case "forced":
|
|
colorizedMsg = console.Colorize("ClearSession", msg+" cleared forcefully.")
|
|
}
|
|
return colorizedMsg
|
|
}
|
|
|
|
// JSON jsonified clear session message.
|
|
func (c clearSessionMessage) JSON() string {
|
|
clearSessionJSONBytes, e := json.MarshalIndent(c, "", " ")
|
|
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
|
|
|
|
return string(clearSessionJSONBytes)
|
|
}
|
|
|
|
// forceClear - Remove a saved session.
|
|
// Used if --force flag is applied.
|
|
func forceClear(sid string, session *sessionV8) {
|
|
if session != nil {
|
|
if err := session.Delete().Trace(sid); err == nil {
|
|
// Force unnecesseray removal successful.
|
|
printMsg(clearSessionMessage{Status: "success", SessionID: sid})
|
|
return
|
|
}
|
|
}
|
|
// Remove obsolete session files.
|
|
removeSessionFile(sid)
|
|
removeSessionDataFile(sid)
|
|
printMsg(clearSessionMessage{Status: "forced", SessionID: sid})
|
|
}
|
|
|
|
// clearSession clear sessions.
|
|
func clearSession(sid string, isForce bool) {
|
|
var toRemove []string
|
|
if sid == "all" {
|
|
toRemove = getSessionIDs()
|
|
} else {
|
|
toRemove = append(toRemove, sid)
|
|
}
|
|
for _, sid := range toRemove {
|
|
session, err := loadSessionV8(sid)
|
|
if !isForce {
|
|
fatalIf(err.Trace(sid), "Unable to load session `"+sid+"`. Use --force flag to remove obsolete session files.")
|
|
|
|
fatalIf(session.Delete().Trace(sid), "Unable to remove session `"+sid+"`. Use --force flag to remove obsolete session files.")
|
|
|
|
printMsg(clearSessionMessage{Status: "success", SessionID: sid})
|
|
continue
|
|
}
|
|
// Forced removal of a session.
|
|
forceClear(sid, session)
|
|
}
|
|
}
|
|
|
|
// checkSessionClearSyntax - Check syntax of 'session clear sid'.
|
|
func checkSessionClearSyntax(ctx *cli.Context) {
|
|
if len(ctx.Args()) == 0 || len(ctx.Args()) > 2 {
|
|
cli.ShowCommandHelpAndExit(ctx, "clear", 1) // last argument is exit code
|
|
}
|
|
}
|
|
|
|
// mainSessionClear - Main session clear.
|
|
func mainSessionClear(ctx *cli.Context) error {
|
|
// Check command arguments
|
|
checkSessionClearSyntax(ctx)
|
|
|
|
// Additional command specific theme customization.
|
|
console.SetColor("Command", color.New(color.FgWhite, color.Bold))
|
|
console.SetColor("SessionID", color.New(color.FgYellow, color.Bold))
|
|
console.SetColor("SessionTime", color.New(color.FgGreen))
|
|
console.SetColor("ClearSession", color.New(color.FgGreen, color.Bold))
|
|
|
|
if !isSessionDirExists() {
|
|
fatalIf(createSessionDir().Trace(), "Unable to create session folder.")
|
|
}
|
|
// Set command flags.
|
|
isForce := ctx.Bool("force")
|
|
|
|
// Retrieve requested session id.
|
|
sessionID := ctx.Args().Get(0)
|
|
|
|
// Purge requested session id or all pending sessions.
|
|
clearSession(sessionID, isForce)
|
|
return nil
|
|
}
|