package common import ( "errors" "os" commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/version" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl" versionSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version" "github.com/spf13/cobra" ) var errUnsupportedEACLFormat = errors.New("unsupported eACL format") // ReadEACL reads extended ACL table from eaclPath. func ReadEACL(cmd *cobra.Command, eaclPath string) *eacl.Table { _, err := os.Stat(eaclPath) // check if `eaclPath` is an existing file if err != nil { commonCmd.ExitOnErr(cmd, "", errors.New("incorrect path to file with EACL")) } PrintVerbose(cmd, "Reading EACL from file: %s", eaclPath) data, err := os.ReadFile(eaclPath) commonCmd.ExitOnErr(cmd, "can't read file with EACL: %w", err) table := eacl.NewTable() if err = table.UnmarshalJSON(data); err == nil { validateAndFixEACLVersion(table) PrintVerbose(cmd, "Parsed JSON encoded EACL table") return table } if err = table.Unmarshal(data); err == nil { validateAndFixEACLVersion(table) PrintVerbose(cmd, "Parsed binary encoded EACL table") return table } commonCmd.ExitOnErr(cmd, "", errUnsupportedEACLFormat) return nil } func validateAndFixEACLVersion(table *eacl.Table) { if !version.IsValid(table.Version()) { table.SetVersion(versionSDK.Current()) } }