| 2467 | } |
| 2468 | |
| 2469 | func (f *Fs) lifecycleCommand(ctx context.Context, name string, arg []string, opt map[string]string) (out any, err error) { |
| 2470 | var newRule api.LifecycleRule |
| 2471 | if daysStr := opt["daysFromHidingToDeleting"]; daysStr != "" { |
| 2472 | days, err := strconv.Atoi(daysStr) |
| 2473 | if err != nil { |
| 2474 | return nil, fmt.Errorf("bad daysFromHidingToDeleting: %w", err) |
| 2475 | } |
| 2476 | newRule.DaysFromHidingToDeleting = &days |
| 2477 | } |
| 2478 | if daysStr := opt["daysFromUploadingToHiding"]; daysStr != "" { |
| 2479 | days, err := strconv.Atoi(daysStr) |
| 2480 | if err != nil { |
| 2481 | return nil, fmt.Errorf("bad daysFromUploadingToHiding: %w", err) |
| 2482 | } |
| 2483 | newRule.DaysFromUploadingToHiding = &days |
| 2484 | } |
| 2485 | if daysStr := opt["daysFromStartingToCancelingUnfinishedLargeFiles"]; daysStr != "" { |
| 2486 | days, err := strconv.Atoi(daysStr) |
| 2487 | if err != nil { |
| 2488 | return nil, fmt.Errorf("bad daysFromStartingToCancelingUnfinishedLargeFiles: %w", err) |
| 2489 | } |
| 2490 | newRule.DaysFromStartingToCancelingUnfinishedLargeFiles = &days |
| 2491 | } |
| 2492 | bucketName, _ := f.split("") |
| 2493 | if bucketName == "" { |
| 2494 | return nil, errors.New("bucket required") |
| 2495 | |
| 2496 | } |
| 2497 | |
| 2498 | skip := operations.SkipDestructive(ctx, name, "update lifecycle rules") |
| 2499 | |
| 2500 | var bucket *api.Bucket |
| 2501 | if !skip && (newRule.DaysFromHidingToDeleting != nil || newRule.DaysFromUploadingToHiding != nil || newRule.DaysFromStartingToCancelingUnfinishedLargeFiles != nil) { |
| 2502 | bucketID, err := f.getBucketID(ctx, bucketName) |
| 2503 | if err != nil { |
| 2504 | return nil, err |
| 2505 | } |
| 2506 | opts := rest.Opts{ |
| 2507 | Method: "POST", |
| 2508 | Path: "/b2_update_bucket", |
| 2509 | } |
| 2510 | var request = api.UpdateBucketRequest{ |
| 2511 | ID: bucketID, |
| 2512 | AccountID: f.info.AccountID, |
| 2513 | LifecycleRules: []api.LifecycleRule{newRule}, |
| 2514 | } |
| 2515 | var response api.Bucket |
| 2516 | err = f.pacer.Call(func() (bool, error) { |
| 2517 | resp, err := f.srv.CallJSON(ctx, &opts, &request, &response) |
| 2518 | return f.shouldRetry(ctx, resp, err) |
| 2519 | }) |
| 2520 | if err != nil { |
| 2521 | return nil, err |
| 2522 | } |
| 2523 | bucket = &response |
| 2524 | } else { |
| 2525 | err = f.listBucketsToFn(ctx, bucketName, func(b *api.Bucket) error { |
| 2526 | bucket = b |