forked from TrueCloudLab/frostfs-node
50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package common
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
|
|
commonCmd "github.com/TrueCloudLab/frostfs-node/cmd/internal/common"
|
|
"github.com/TrueCloudLab/frostfs-node/pkg/core/version"
|
|
"github.com/TrueCloudLab/frostfs-sdk-go/eacl"
|
|
versionSDK "github.com/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())
|
|
}
|
|
}
|