spiegel_podman/cmd/podman/system/reset.go
Jan Rodák 41924f870f
Prevents removal of podman.sock file using podman system reset command
The `podman system reset` removes the `RunDirectory` directory as part of the machine reset, where `podman.sock` is usually stored.

Fixes: https://issues.redhat.com/browse/RHEL-71320

Signed-off-by: Jan Rodák <hony.com@seznam.cz>
2025-03-10 18:44:15 +01:00

106 lines
3 KiB
Go

//go:build !remote
package system
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/containers/buildah/pkg/volumes"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v5/cmd/podman/registry"
"github.com/containers/podman/v5/cmd/podman/validate"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
systemResetDescription = `Reset podman storage back to default state
All containers will be stopped and removed, and all images, volumes, networks and container content will be removed.
This command does not restart podman.service and podman.socket systemd units. You may need to manually restart it after running this command.
`
systemResetCommand = &cobra.Command{
Annotations: map[string]string{registry.EngineMode: registry.ABIMode},
Use: "reset [options]",
Args: validate.NoArgs,
Short: "Reset podman storage",
Long: systemResetDescription,
Run: reset,
ValidArgsFunction: completion.AutocompleteNone,
}
forceFlag bool
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Command: systemResetCommand,
Parent: systemCmd,
})
flags := systemResetCommand.Flags()
flags.BoolVarP(&forceFlag, "force", "f", false, "Do not prompt for confirmation")
}
func reset(cmd *cobra.Command, args []string) {
// Get all the external containers in use
listCtn, err := registry.ContainerEngine().ContainerListExternal(registry.Context())
if err != nil {
logrus.Error(err)
}
// Prompt for confirmation if --force is not set
if !forceFlag {
reader := bufio.NewReader(os.Stdin)
fmt.Println(`WARNING! This will remove:
- all containers
- all pods
- all images
- all networks
- all build cache
- all machines
- all volumes`)
info, _ := registry.ContainerEngine().Info(registry.Context())
// lets not hard fail in case of an error
if info != nil {
fmt.Printf(" - the graphRoot directory: %q\n", info.Store.GraphRoot)
fmt.Printf(" - the runRoot directory: %q\n", info.Store.RunRoot)
}
if len(listCtn) > 0 {
fmt.Println(`WARNING! The following external containers will be purged:`)
// print first 12 characters of ID and first configured name alias
for _, externalCtn := range listCtn {
fmt.Printf(" - %s (%s)\n", externalCtn.ID[0:12], externalCtn.Names[0])
}
}
fmt.Print(`Are you sure you want to continue? [y/N] `)
answer, err := reader.ReadString('\n')
if err != nil {
logrus.Error(err)
os.Exit(1)
}
if strings.ToLower(answer)[0] != 'y' {
os.Exit(0)
}
}
// Clean build cache if any
if err := volumes.CleanCacheMount(); err != nil {
logrus.Error(err)
}
// ContainerEngine() is unusable and shut down after this.
if err := registry.ContainerEngine().Reset(registry.Context()); err != nil {
logrus.Error(err)
}
// Shutdown podman-machine and delete all machine files
if err := resetMachine(); err != nil {
logrus.Error(err)
}
os.Exit(0)
}