Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 79 additions & 8 deletions cmd/akavecli/ipc.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,12 @@ func cmdCreateBucketIPC(cmd *cobra.Command, args []string) (err error) {
defer mon.Task()(&ctx, args)(&err)
bucketName := args[0]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -228,7 +233,12 @@ func cmdDeleteBucketIPC(cmd *cobra.Command, args []string) (err error) {
defer mon.Task()(&ctx, args)(&err)
bucketName := args[0]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -257,7 +267,12 @@ func cmdViewBucketIPC(cmd *cobra.Command, args []string) (err error) {
defer mon.Task()(&ctx, args)(&err)
bucketName := args[0]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -286,7 +301,12 @@ func cmdListBucketsIPC(cmd *cobra.Command, args []string) (err error) {
ctx := cmd.Context()
defer mon.Task()(&ctx, args)(&err)

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -322,7 +342,12 @@ func cmdListFilesIPC(cmd *cobra.Command, args []string) (err error) {
defer mon.Task()(&ctx, args)(&err)
bucketName := args[0]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -359,7 +384,12 @@ func cmdFileInfoIPC(cmd *cobra.Command, args []string) (err error) {
bucketName := args[0]
fileName := args[1]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -406,7 +436,12 @@ func cmdFileUploadIPC(cmd *cobra.Command, args []string) (err error) {
return fmt.Errorf("failed to get file info: %w", err)
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -442,7 +477,12 @@ func cmdFileDownloadIPC(cmd *cobra.Command, args []string) (err error) {
fileName := args[1]
destPath := args[2]

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privateKey))
privKey, _, _, err := getWalletPrivateKey(cmd)
if err != nil {
return err
}

akaveSDK, err := sdk.New(nodeRPCAddress, maxConcurrency, blockPartSize, useConnectionPool, sdk.WithPrivateKey(privKey))
if err != nil {
return err
}
Expand Down Expand Up @@ -479,3 +519,34 @@ func cmdFileDownloadIPC(cmd *cobra.Command, args []string) (err error) {
cmd.PrintErrf("File downloaded successfully: Name=%s, Path=%s\n", fileName, filepath.Join(destPath, fileName))
return nil
}

// getWalletPrivateKey returns the private key either from the flag or from a wallet.
// It also returns the wallet address and name if a wallet was used.
func getWalletPrivateKey(cmd *cobra.Command) (privKey, walletName, walletAddress string, err error) {
if privateKey != "" {
return privateKey, "", "", nil
}

privKey, walletAddress, err = getPrivateKeyFromWallet(accountName)
if err != nil {
return "", "", "", fmt.Errorf("failed to get wallet private key: %w", err)
}

name := accountName
if name == "" {
// If no account was specified, we used the first available wallet
// Get the name from the address for display purposes
keystoreDir := getDefaultKeystoreDir()
entries, _ := os.ReadDir(keystoreDir)
for _, entry := range entries {
if !strings.HasSuffix(entry.Name(), walletFileExt) {
continue
}
name = strings.TrimSuffix(entry.Name(), walletFileExt)
break
}
}

cmd.PrintErrf("Using wallet account: %s (%s)\n", name, walletAddress)
return privKey, name, walletAddress, nil
}
10 changes: 9 additions & 1 deletion cmd/akavecli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ var (

tracingAgentAddr = "localhost:6831"
serviceName = "akavecli"

accountName string
)

// CmdParamsError represents an error related to positional arguments.
Expand Down Expand Up @@ -159,18 +161,24 @@ func init() {
ipcFileCmd.AddCommand(ipcFileListCmd)
ipcFileCmd.AddCommand(ipcFileInfoCmd)

// Initialize wallet commands
initWalletCommands()

rootCmd.AddCommand(versionCmd)
rootCmd.AddCommand(bucketCmd)
rootCmd.AddCommand(fileStreamingCmd)
rootCmd.AddCommand(ipcCmd)
rootCmd.AddCommand(walletCmd)
}

func initFlags() {
rootCmd.PersistentFlags().StringVar(&nodeRPCAddress, "node-address", "127.0.0.1:5000", "The address of the node RPC")
rootCmd.PersistentFlags().IntVar(&maxConcurrency, "maxConcurrency", 10, "Maximum concurrency level")
rootCmd.PersistentFlags().Int64Var(&blockPartSize, "blockPartSize", (memory.KiB * 128).ToInt64(), "Size of each block part")
rootCmd.PersistentFlags().BoolVar(&useConnectionPool, "useConnectionPool", true, "Use connection pool")
ipcCmd.PersistentFlags().StringVar(&privateKey, "private-key", "", "Private key for signing IPC transactions")
ipcCmd.PersistentFlags().StringVar(&privateKey, "private-key", "", "Optional: Private key for signing IPC transactions. If not provided, will use the specified or default wallet account")

rootCmd.PersistentFlags().StringVar(&accountName, "account", "", "Optional: Wallet name to use for IPC operations. If not provided, will use the first available wallet")
}

func initTracing(log *zap.Logger) (*mJaeger.ThriftCollector, func()) {
Expand Down
Loading