3
0

Add system setting import/export

This commit is contained in:
Tomaž Jerman 2019-10-11 13:13:47 +02:00
parent cb202d474d
commit 7a7839809d
4 changed files with 155 additions and 1 deletions

135
system/commands/exporter.go Normal file
View File

@ -0,0 +1,135 @@
package commands
import (
"context"
"strings"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
"github.com/cortezaproject/corteza-server/pkg/auth"
"github.com/cortezaproject/corteza-server/pkg/cli"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/settings"
"github.com/cortezaproject/corteza-server/system/service"
sysTypes "github.com/cortezaproject/corteza-server/system/types"
)
func Exporter(ctx context.Context, c *cli.Config) *cobra.Command {
cmd := &cobra.Command{
Use: "export",
Short: "Export",
Long: `Export system resources`,
Run: func(cmd *cobra.Command, args []string) {
c.InitServices(ctx, c)
ctx = auth.SetSuperUserContext(ctx)
var (
sFlag = cmd.Flags().Lookup("settings").Changed
pFlag = cmd.Flags().Lookup("permissions").Changed
out = &System{
Settings: yaml.MapSlice{},
}
)
if !sFlag && !pFlag {
cli.HandleError(errors.New("Specify setting or permissions flag"))
}
if pFlag {
permissionExporter(ctx, out)
}
if sFlag {
settingExporter(ctx, out)
}
y := yaml.NewEncoder(cmd.OutOrStdout())
cli.HandleError(y.Encode(out))
},
}
cmd.Flags().BoolP("settings", "s", false, "Export settings")
cmd.Flags().BoolP("permissions", "p", false, "Export permission")
return cmd
}
func permissionExporter(ctx context.Context, out *System) {
roles = sysTypes.RoleSet{
&sysTypes.Role{ID: permissions.EveryoneRoleID, Handle: "everyone"},
&sysTypes.Role{ID: permissions.AdminsRoleID, Handle: "admins"},
}
out.Allow = expServicePermissions(permissions.Allow)
out.Deny = expServicePermissions(permissions.Deny)
}
func settingExporter(ctx context.Context, out *System) {
var (
err error
)
ss, err := service.DefaultSettings.FindByPrefix("")
cli.HandleError(err)
out.Settings = settings.Export(ss)
}
// This is PoC for exporting system resources
//
type (
System struct {
Settings yaml.MapSlice `yaml:",omitempty"`
Allow map[string]map[string][]string `yaml:",omitempty"`
Deny map[string]map[string][]string `yaml:",omitempty"`
}
)
var (
roles sysTypes.RoleSet
)
// @todo move to pkg/permissions
func expServicePermissions(access permissions.Access) map[string]map[string][]string {
var (
has bool
res string
rules permissions.RuleSet
sp = make(map[string]map[string][]string)
)
for _, r := range roles {
rules = service.DefaultPermissions.FindRulesByRoleID(r.ID)
if len(rules) == 0 {
continue
}
for _, rule := range rules {
if rule.Resource.GetService() != rule.Resource && !rule.Resource.HasWildcard() {
continue
}
res = strings.TrimRight(rule.Resource.String(), ":*")
if _, has = sp[r.Handle]; !has {
sp[r.Handle] = map[string][]string{}
}
if _, has = sp[r.Handle][res]; !has {
sp[r.Handle][res] = make([]string, 0)
}
sp[r.Handle][res] = append(sp[r.Handle][res], rule.Operation.String())
}
}
return sp
}

View File

@ -7,6 +7,7 @@ import (
"gopkg.in/yaml.v2"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/settings"
"github.com/cortezaproject/corteza-server/system/service"
"github.com/cortezaproject/corteza-server/system/types"
)
@ -26,6 +27,7 @@ func Import(ctx context.Context, ff ...io.Reader) (err error) {
pi := permissions.NewImporter(service.DefaultAccessControl.Whitelist())
imp := NewImporter(
pi,
settings.NewImporter(),
NewRoleImport(pi, roles),
)
@ -51,6 +53,7 @@ func Import(ctx context.Context, ff ...io.Reader) (err error) {
ctx,
service.DefaultRole.With(ctx),
service.DefaultAccessControl,
service.DefaultSettings,
roles,
)
}

View File

@ -7,13 +7,16 @@ import (
"github.com/cortezaproject/corteza-server/pkg/deinterfacer"
"github.com/cortezaproject/corteza-server/pkg/importer"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/settings"
"github.com/cortezaproject/corteza-server/system/types"
"github.com/pkg/errors"
)
type (
Importer struct {
roles *Role
permissions importer.PermissionImporter
settings importer.SettingImporter
}
roleFinder interface {
@ -21,10 +24,11 @@ type (
}
)
func NewImporter(p importer.PermissionImporter, ri *Role) *Importer {
func NewImporter(p importer.PermissionImporter, s importer.SettingImporter, ri *Role) *Importer {
return &Importer{
roles: ri,
permissions: p,
settings: s,
}
}
@ -39,6 +43,9 @@ func (imp *Importer) Cast(in interface{}) (err error) {
case "allow", "deny":
return imp.permissions.CastResourcesSet(key, val)
case "settings":
return imp.settings.CastSet(val)
default:
err = fmt.Errorf("unexpected key %q", key)
}
@ -51,6 +58,7 @@ func (imp *Importer) Store(
ctx context.Context,
rk roleKeeper,
pk permissions.ImportKeeper,
sk settings.ImportKeeper,
roles types.RoleSet,
) (err error) {
err = imp.roles.Store(ctx, rk)
@ -69,5 +77,10 @@ func (imp *Importer) Store(
return
}
err = imp.settings.Store(ctx, sk)
if err != nil {
return errors.Wrap(err, "could not import settings")
}
return nil
}

View File

@ -126,6 +126,9 @@ func Configure() *cli.Config {
func(ctx context.Context, c *cli.Config) *cobra.Command {
return commands.Importer(ctx, c)
},
func(ctx context.Context, c *cli.Config) *cobra.Command {
return commands.Exporter(ctx, c)
},
func(ctx context.Context, c *cli.Config) *cobra.Command {
return commands.Users(ctx, c)
},