blob: 507c3709f06a750ad9c7021f567dacdd36a5d3d7 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package botanist
import (
"bytes"
"context"
"fmt"
"path/filepath"
"time"
"go.fuchsia.dev/fuchsia/tools/lib/osmisc"
"go.fuchsia.dev/fuchsia/tools/lib/retry"
"go.fuchsia.dev/fuchsia/tools/net/tftp"
)
// FetchAndCopyFile fetches a remote file via TFTP from a given node, and
// writes it to an output directory.
func FetchAndCopyFile(ctx context.Context, t tftp.Client, path, name, outDir string) error {
return retry.Retry(ctx, retry.WithMaxAttempts(retry.NewConstantBackoff(time.Second), 3), func() error {
var err error
var reader *bytes.Reader
for {
reader, err = t.Read(ctx, path)
switch err {
case nil:
case tftp.ErrShouldWait:
time.Sleep(time.Second)
continue
default:
return fmt.Errorf("failed to receive file %s: %s", path, err)
}
break
}
outputFile := filepath.Join(outDir, name)
w, err := osmisc.CreateFile(outputFile)
if err != nil {
return fmt.Errorf("failed to create file: %v", err)
}
defer w.Close()
_, err = reader.WriteTo(w)
return err
}, nil)
}