107 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.0 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)
 | 
						|
}
 |