package zombie import ( "crypto/sha256" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/commonflags" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-node/config" commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" containerCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/container" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/engine" cntClient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" "github.com/spf13/cobra" ) func restore(cmd *cobra.Command, _ []string) { configFile, _ := cmd.Flags().GetString(commonflags.ConfigFlag) configDir, _ := cmd.Flags().GetString(commonflags.ConfigDirFlag) appCfg := config.New(configFile, configDir, config.EnvPrefix) storageEngine := newEngine(cmd, appCfg) q := createQuarantine(cmd, storageEngine.DumpInfo()) morphClient := createMorphClient(cmd, appCfg) cnrCli := createContainerClient(cmd, morphClient) var containerID cid.ID cidStr, _ := cmd.Flags().GetString(cidFlag) commonCmd.ExitOnErr(cmd, "decode container ID string: %w", containerID.DecodeString(cidStr)) var objectID *oid.ID oidStr, _ := cmd.Flags().GetString(oidFlag) if oidStr != "" { objectID = &oid.ID{} commonCmd.ExitOnErr(cmd, "decode object ID string: %w", objectID.DecodeString(oidStr)) } if objectID != nil { var addr oid.Address addr.SetContainer(containerID) addr.SetObject(*objectID) restoreObject(cmd, storageEngine, q, addr, cnrCli) } else { commonCmd.ExitOnErr(cmd, "iterate over quarantine: %w", q.Iterate(cmd.Context(), func(addr oid.Address) error { if addr.Container() != containerID { return nil } restoreObject(cmd, storageEngine, q, addr, cnrCli) return nil })) } } func restoreObject(cmd *cobra.Command, storageEngine *engine.StorageEngine, q *quarantine, addr oid.Address, cnrCli *cntClient.Client) { obj, err := q.Get(cmd.Context(), addr) commonCmd.ExitOnErr(cmd, "get object from quarantine: %w", err) rawCID := make([]byte, sha256.Size) cid := addr.Container() cid.Encode(rawCID) cnr, err := cnrCli.Get(cmd.Context(), rawCID) commonCmd.ExitOnErr(cmd, "get container: %w", err) putPrm := engine.PutPrm{ Object: obj, IsIndexedContainer: containerCore.IsIndexedContainer(cnr.Value), } commonCmd.ExitOnErr(cmd, "put object to storage engine: %w", storageEngine.Put(cmd.Context(), putPrm)) commonCmd.ExitOnErr(cmd, "remove object from quarantine: %w", q.Delete(cmd.Context(), addr)) }