2024-02-01 07:20:17 +00:00
|
|
|
package ape
|
2023-12-20 12:44:12 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2024-02-13 13:22:08 +00:00
|
|
|
"strings"
|
2023-12-20 12:44:12 +00:00
|
|
|
|
2024-02-02 12:04:48 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/commonflags"
|
2023-12-20 12:44:12 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/config"
|
2024-02-02 12:26:57 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/constants"
|
2024-02-02 12:36:14 +00:00
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/helper"
|
2023-12-20 12:44:12 +00:00
|
|
|
parseutil "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-cli/modules/util"
|
|
|
|
commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common"
|
|
|
|
apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
|
|
|
|
policyengine "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
|
|
|
morph "git.frostfs.info/TrueCloudLab/policy-engine/pkg/morph/policy"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/management"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
)
|
|
|
|
|
2024-02-13 13:22:08 +00:00
|
|
|
const (
|
|
|
|
ingress = "ingress"
|
|
|
|
s3 = "s3"
|
|
|
|
)
|
|
|
|
|
|
|
|
var mChainName = map[string]apechain.Name{
|
|
|
|
ingress: apechain.Ingress,
|
|
|
|
s3: apechain.S3,
|
|
|
|
}
|
|
|
|
|
2023-12-20 12:44:12 +00:00
|
|
|
func parseTarget(cmd *cobra.Command) policyengine.Target {
|
|
|
|
var targetType policyengine.TargetType
|
|
|
|
typ, _ := cmd.Flags().GetString(targetTypeFlag)
|
|
|
|
switch typ {
|
|
|
|
case namespaceTarget:
|
|
|
|
targetType = policyengine.Namespace
|
|
|
|
case containerTarget:
|
|
|
|
targetType = policyengine.Container
|
|
|
|
default:
|
|
|
|
commonCmd.ExitOnErr(cmd, "read target type error: %w", fmt.Errorf("unknown target type"))
|
|
|
|
}
|
|
|
|
name, _ := cmd.Flags().GetString(targetNameFlag)
|
|
|
|
|
|
|
|
return policyengine.Target{
|
|
|
|
Name: name,
|
|
|
|
Type: targetType,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseChainID(cmd *cobra.Command) apechain.ID {
|
|
|
|
chainID, _ := cmd.Flags().GetString(chainIDFlag)
|
|
|
|
if chainID == "" {
|
|
|
|
commonCmd.ExitOnErr(cmd, "read chain id error: %w",
|
|
|
|
fmt.Errorf("chain id cannot be empty"))
|
|
|
|
}
|
|
|
|
return apechain.ID(chainID)
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseChain(cmd *cobra.Command) *apechain.Chain {
|
|
|
|
chain := new(apechain.Chain)
|
|
|
|
|
2024-02-16 09:59:48 +00:00
|
|
|
if rules, _ := cmd.Flags().GetStringArray(ruleFlag); len(rules) > 0 {
|
|
|
|
commonCmd.ExitOnErr(cmd, "parser error: %w", parseutil.ParseAPEChain(chain, rules))
|
|
|
|
} else if encPath, _ := cmd.Flags().GetString(pathFlag); encPath != "" {
|
|
|
|
commonCmd.ExitOnErr(cmd, "decode binary or json error: %w", parseutil.ParseAPEChainBinaryOrJSON(chain, encPath))
|
2023-12-20 12:44:12 +00:00
|
|
|
} else {
|
2024-02-16 09:59:48 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "parser error: %w", fmt.Errorf("rule is not passed"))
|
2023-12-20 12:44:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
chain.ID = parseChainID(cmd)
|
|
|
|
|
2024-02-16 09:59:48 +00:00
|
|
|
cmd.Println("Parsed chain:")
|
|
|
|
parseutil.PrintHumanReadableAPEChain(cmd, chain)
|
|
|
|
|
2023-12-20 12:44:12 +00:00
|
|
|
return chain
|
|
|
|
}
|
|
|
|
|
2024-02-13 13:22:08 +00:00
|
|
|
func parseChainName(cmd *cobra.Command) apechain.Name {
|
|
|
|
chainName, _ := cmd.Flags().GetString(chainNameFlag)
|
|
|
|
apeChainName, ok := mChainName[strings.ToLower(chainName)]
|
|
|
|
if !ok {
|
|
|
|
commonCmd.ExitOnErr(cmd, "", fmt.Errorf("unsupported chain name"))
|
|
|
|
}
|
|
|
|
return apeChainName
|
|
|
|
}
|
|
|
|
|
2023-12-20 12:44:12 +00:00
|
|
|
func newPolicyContractInterface(cmd *cobra.Command) (*morph.ContractStorage, *actor.Actor) {
|
|
|
|
v := viper.GetViper()
|
2024-02-02 12:36:14 +00:00
|
|
|
c, err := helper.GetN3Client(v)
|
2023-12-20 12:44:12 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "unable to create NEO rpc client: %w", err)
|
|
|
|
|
2024-02-02 12:04:48 +00:00
|
|
|
walletDir := config.ResolveHomePath(viper.GetString(commonflags.AlphabetWalletsFlag))
|
2024-02-02 12:36:14 +00:00
|
|
|
wallets, err := helper.GetAlphabetWallets(v, walletDir)
|
2023-12-20 12:44:12 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "unable to get alphabet wallets: %w", err)
|
|
|
|
|
2024-02-02 12:36:14 +00:00
|
|
|
committeeAcc, err := helper.GetWalletAccount(wallets[0], constants.CommitteeAccountName)
|
2023-12-20 12:44:12 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "can't find committee account: %w", err)
|
|
|
|
|
2024-02-02 12:36:14 +00:00
|
|
|
ac, err := helper.NewActor(c, committeeAcc)
|
2023-12-20 12:44:12 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "can't create actor: %w", err)
|
|
|
|
|
|
|
|
inv := &ac.Invoker
|
|
|
|
var ch util.Uint160
|
|
|
|
r := management.NewReader(inv)
|
|
|
|
nnsCs, err := r.GetContractByID(1)
|
|
|
|
commonCmd.ExitOnErr(cmd, "can't get NNS contract state: %w", err)
|
|
|
|
|
2024-02-02 12:36:14 +00:00
|
|
|
ch, err = helper.NNSResolveHash(inv, nnsCs.Hash, helper.DomainOf(constants.PolicyContract))
|
2023-12-20 12:44:12 +00:00
|
|
|
commonCmd.ExitOnErr(cmd, "unable to resolve policy contract hash: %w", err)
|
|
|
|
|
|
|
|
return morph.NewContractStorage(ac, ch), ac
|
|
|
|
}
|