update-userdata-devtool #58
| @ -52,7 +52,6 @@ func SearchDomains() []string { | |||||||
| 	return ParsedDomains | 	return ParsedDomains | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| func Language() string { | func Language() string { | ||||||
| 	return viseconfig.DefaultLanguage | 	return viseconfig.DefaultLanguage | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,8 +7,8 @@ import ( | |||||||
| 	"os" | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 
 | 
 | ||||||
| 	"git.defalsify.org/vise.git/logging" |  | ||||||
| 	"git.defalsify.org/vise.git/engine" | 	"git.defalsify.org/vise.git/engine" | ||||||
|  | 	"git.defalsify.org/vise.git/logging" | ||||||
| 
 | 
 | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/config" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/config" | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | ||||||
| @ -87,5 +87,4 @@ func main() { | |||||||
| 		fmt.Fprintf(os.Stderr, "cmd exec error: %v\n", err) | 		fmt.Fprintf(os.Stderr, "cmd exec error: %v\n", err) | ||||||
| 		os.Exit(1) | 		os.Exit(1) | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,9 +3,11 @@ package cmd | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"regexp" | ||||||
| 
 | 
 | ||||||
| 	"git.defalsify.org/vise.git/logging" | 	"git.defalsify.org/vise.git/db" | ||||||
| 	"git.defalsify.org/vise.git/engine" | 	"git.defalsify.org/vise.git/engine" | ||||||
|  | 	"git.defalsify.org/vise.git/logging" | ||||||
| 	"git.defalsify.org/vise.git/persist" | 	"git.defalsify.org/vise.git/persist" | ||||||
| 	"git.defalsify.org/vise.git/resource" | 	"git.defalsify.org/vise.git/resource" | ||||||
| 	"git.defalsify.org/vise.git/state" | 	"git.defalsify.org/vise.git/state" | ||||||
| @ -16,10 +18,12 @@ import ( | |||||||
| var argc map[string]int = map[string]int{ | var argc map[string]int = map[string]int{ | ||||||
| 	"reset": 0, | 	"reset": 0, | ||||||
| 	"admin": 1, | 	"admin": 1, | ||||||
|  | 	"clone": 1, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	logg             = logging.NewVanilla().WithDomain("cmd").WithContextKey("SessionId") | 	logg             = logging.NewVanilla().WithDomain("cmd").WithContextKey("SessionId") | ||||||
|  | 	cloneTargetRegex = `^\+000` | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Cmd struct { | type Cmd struct { | ||||||
| @ -28,6 +32,7 @@ type Cmd struct { | |||||||
| 	flagParser   *application.FlagManager | 	flagParser   *application.FlagManager | ||||||
| 	cmd          int | 	cmd          int | ||||||
| 	enable       bool | 	enable       bool | ||||||
|  | 	param        string | ||||||
| 	exec         func(ctx context.Context, ss storage.StorageService) error | 	exec         func(ctx context.Context, ss storage.StorageService) error | ||||||
| 	engineConfig *engine.Config | 	engineConfig *engine.Config | ||||||
| 	st           *state.State | 	st           *state.State | ||||||
| @ -70,6 +75,50 @@ func (c *Cmd) engine(ctx context.Context, rs resource.Resource, pe *persist.Pers | |||||||
| 	return en, nil | 	return en, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Cmd) execClone(ctx context.Context, ss storage.StorageService) error { | ||||||
|  | 	re := regexp.MustCompile(cloneTargetRegex) | ||||||
|  | 	if !re.MatchString(c.param) { | ||||||
|  | 		return fmt.Errorf("Clone sessionId must match target: %s", c.param) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pe, err := ss.GetPersister(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("get persister error: %v", err) | ||||||
|  | 	} | ||||||
|  | 	err = pe.Load(c.engineConfig.SessionId) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("persister load error: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/// TODO consider DRY with devtools/store/dump
 | ||||||
|  | 	store, err := ss.GetUserdataDb(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("store retrieve error: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	store.SetSession(c.engineConfig.SessionId) | ||||||
|  | 	store.SetPrefix(db.DATATYPE_USERDATA) | ||||||
|  | 	dmp, err := store.Dump(ctx, []byte("")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("store dump fail: %v\n", err.Error()) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for true { | ||||||
|  | 		store.SetSession(c.engineConfig.SessionId) | ||||||
|  | 		k, v := dmp.Next(ctx) | ||||||
|  | 		if k == nil { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		store.SetSession(c.param) | ||||||
|  | 		err = store.Put(ctx, k, v) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("user data store clone failed on key: %x", k) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return pe.Save(c.param) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cmd) execReset(ctx context.Context, ss storage.StorageService) error { | func (c *Cmd) execReset(ctx context.Context, ss storage.StorageService) error { | ||||||
| 	pe, err := ss.GetPersister(ctx) | 	pe, err := ss.GetPersister(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -157,6 +206,16 @@ func (c *Cmd) parseCmdReset(cmd string, param string, more []string) (bool, erro | |||||||
| 	return false, nil | 	return false, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Cmd) parseCmdClone(cmd string, param string, more []string) (bool, error) { | ||||||
|  | 	if cmd == "clone" { | ||||||
|  | 		c.enable = false | ||||||
|  | 		c.param = param | ||||||
|  | 		c.exec = c.execClone | ||||||
|  | 		return true, nil | ||||||
|  | 	} | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cmd) Parse(args []string) error { | func (c *Cmd) Parse(args []string) error { | ||||||
| 	var param string | 	var param string | ||||||
| 	if len(args) < 1 { | 	if len(args) < 1 { | ||||||
| @ -169,7 +228,7 @@ func (c *Cmd) Parse(args []string) error { | |||||||
| 		return fmt.Errorf("invalid command: %v", cmd) | 		return fmt.Errorf("invalid command: %v", cmd) | ||||||
| 	} | 	} | ||||||
| 	if n > 0 { | 	if n > 0 { | ||||||
| 		if len(args) < n + 1 { | 		if len(args) < n+1 { | ||||||
| 			return fmt.Errorf("Wrong number of arguments, need: %d", n) | 			return fmt.Errorf("Wrong number of arguments, need: %d", n) | ||||||
| 		} | 		} | ||||||
| 		param = args[1] | 		param = args[1] | ||||||
| @ -192,6 +251,13 @@ func (c *Cmd) Parse(args []string) error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	r, err = c.parseCmdClone(cmd, param, args) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if r { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return fmt.Errorf("unknown subcommand: %s", cmd) | 	return fmt.Errorf("unknown subcommand: %s", cmd) | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user