package main import ( "errors" "time" "git.ipao.vip/rogee/go-sip/internal/agent" "git.ipao.vip/rogee/go-sip/internal/config" "git.ipao.vip/rogee/go-sip/internal/rpc" "github.com/spf13/cobra" ) func newUploadRetryCommand() *cobra.Command { cfg, configErr := config.FromEnv() var uploadID, requestID, path string cmd := &cobra.Command{ Use: "upload-retry", Short: "explicitly request one new grant for an unsuccessful upload; never dial", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) (returnErr error) { if configErr != nil { return configErr } if uploadID == "" || requestID == "" || path == "" { return errors.New("--upload-id, --request-id and --file are required") } if err := cfg.Validate("agent"); err != nil { return err } if cfg.DispatcherGRPCEndpoint == "" || cfg.DispatcherGRPCServerName == "" { return errors.New("Dispatcher gRPC endpoint and server name are required") } spool, err := agent.NewSpool(cfg.SpoolRoot, time.Now) if err != nil { return err } client, err := rpc.DialFromFiles(cfg.DispatcherGRPCEndpoint, cfg.MTLSCAFile, cfg.MTLSCertFile, cfg.MTLSKeyFile, cfg.DispatcherGRPCServerName) if err != nil { return err } defer func() { returnErr = errors.Join(returnErr, client.Close()) }() record, err := retryUploadRecording(cmd.Context(), cfg, client, agent.UploadClient{Now: time.Now}, spool, uploadID, requestID, path) if err != nil { return err } return writeResult(map[string]any{"upload_id": record.UploadID, "notification_state": record.State, "bytes": record.Result.SizeBytes, "sha256": record.Result.SHA256}) }, } cmd.Flags().StringVar(&cfg.SpoolRoot, "spool", cfg.SpoolRoot, "existing Agent spool root") cmd.Flags().StringVar(&uploadID, "upload-id", "", "existing failed or uncertain upload identity") cmd.Flags().StringVar(&requestID, "request-id", "", "explicit new canonical UUID v4; never reuse a consumed request") cmd.Flags().StringVar(&path, "file", "", "retained original recording; content must match its persisted identity") return cmd }