Support folder URLs

This commit is contained in:
M. Mert Yildiran 2023-06-29 02:13:47 +03:00
parent 242a276c5f
commit 261e850a59
No known key found for this signature in database
GPG Key ID: DA5D6DCBB758A461
2 changed files with 33 additions and 28 deletions

View File

@ -56,7 +56,7 @@ func init() {
tapCmd.Flags().String(configStructs.StorageLimitLabel, defaultTapConfig.StorageLimit, "Override the default storage limit (per node)") tapCmd.Flags().String(configStructs.StorageLimitLabel, defaultTapConfig.StorageLimit, "Override the default storage limit (per node)")
tapCmd.Flags().String(configStructs.StorageClassLabel, defaultTapConfig.StorageClass, "Override the default storage class of the PersistentVolumeClaim (per node)") tapCmd.Flags().String(configStructs.StorageClassLabel, defaultTapConfig.StorageClass, "Override the default storage class of the PersistentVolumeClaim (per node)")
tapCmd.Flags().Bool(configStructs.DryRunLabel, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them") tapCmd.Flags().Bool(configStructs.DryRunLabel, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them")
tapCmd.Flags().StringP(configStructs.PcapLabel, "p", defaultTapConfig.Pcap, fmt.Sprintf("Capture from a PCAP snapshot of %s (.tar.gz) using your Docker Daemon instead of Kubernetes. TAR path, S3 URL (object or bucket)", misc.Software)) tapCmd.Flags().StringP(configStructs.PcapLabel, "p", defaultTapConfig.Pcap, fmt.Sprintf("Capture from a PCAP snapshot of %s (.tar.gz) using your Docker Daemon instead of Kubernetes. TAR path from the file system or an S3 URL (object, folder or the bucket)", misc.Software))
tapCmd.Flags().Bool(configStructs.ServiceMeshLabel, defaultTapConfig.ServiceMesh, "Capture the encrypted traffic if the cluster is configured with a service mesh and with mTLS") tapCmd.Flags().Bool(configStructs.ServiceMeshLabel, defaultTapConfig.ServiceMesh, "Capture the encrypted traffic if the cluster is configured with a service mesh and with mTLS")
tapCmd.Flags().Bool(configStructs.TlsLabel, defaultTapConfig.Tls, "Capture the traffic that's encrypted with OpenSSL or Go crypto/tls libraries") tapCmd.Flags().Bool(configStructs.TlsLabel, defaultTapConfig.Tls, "Capture the traffic that's encrypted with OpenSSL or Go crypto/tls libraries")
tapCmd.Flags().Bool(configStructs.IgnoreTaintedLabel, defaultTapConfig.IgnoreTainted, "Ignore tainted pods while running Worker DaemonSet") tapCmd.Flags().Bool(configStructs.IgnoreTaintedLabel, defaultTapConfig.IgnoreTainted, "Ignore tainted pods while running Worker DaemonSet")

View File

@ -306,7 +306,23 @@ func downloadTarFromS3(s3Url string) (tarPath string, err error) {
return return
} }
if key == "" { var file *os.File
file, err = os.CreateTemp(os.TempDir(), filepath.Base(key))
if err != nil {
return
}
defer file.Close()
log.Info().Str("bucket", bucket).Str("key", key).Msg("Downloading from S3")
downloader := manager.NewDownloader(client)
_, err = downloader.Download(context.TODO(), file, &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
log.Info().Err(err).Msg("S3 object is not found. Assuming URL is not a single object. Listing the objects in given folder or the bucket to download...")
var tempDirPath string var tempDirPath string
tempDirPath, err = os.MkdirTemp(os.TempDir(), "kubeshark_*") tempDirPath, err = os.MkdirTemp(os.TempDir(), "kubeshark_*")
if err != nil { if err != nil {
@ -314,25 +330,30 @@ func downloadTarFromS3(s3Url string) (tarPath string, err error) {
} }
for _, object := range listObjectsOutput.Contents { for _, object := range listObjectsOutput.Contents {
key = *object.Key objectKey := *object.Key
fullPath := filepath.Join(tempDirPath, key) if !strings.HasPrefix(objectKey, key) {
continue
}
fullPath := filepath.Join(tempDirPath, objectKey)
err = os.MkdirAll(filepath.Dir(fullPath), os.ModePerm) err = os.MkdirAll(filepath.Dir(fullPath), os.ModePerm)
if err != nil { if err != nil {
return return
} }
var file *os.File var objectFile *os.File
file, err = os.Create(fullPath) objectFile, err = os.Create(fullPath)
if err != nil { if err != nil {
return return
} }
defer objectFile.Close()
log.Info().Str("bucket", bucket).Str("key", key).Msg("Downloading from S3") log.Info().Str("bucket", bucket).Str("key", objectKey).Msg("Downloading from S3")
downloader := manager.NewDownloader(client) downloader := manager.NewDownloader(client)
_, err = downloader.Download(context.TODO(), file, &s3.GetObjectInput{ _, err = downloader.Download(context.TODO(), objectFile, &s3.GetObjectInput{
Bucket: aws.String(bucket), Bucket: aws.String(bucket),
Key: aws.String(key), Key: aws.String(objectKey),
}) })
if err != nil { if err != nil {
return return
@ -340,27 +361,11 @@ func downloadTarFromS3(s3Url string) (tarPath string, err error) {
} }
tarPath, err = tarDirectory(tempDirPath) tarPath, err = tarDirectory(tempDirPath)
} else { return
var file *os.File
file, err = os.CreateTemp(os.TempDir(), filepath.Base(key))
if err != nil {
return
}
log.Info().Str("bucket", bucket).Str("key", key).Msg("Downloading from S3")
downloader := manager.NewDownloader(client)
_, err = downloader.Download(context.TODO(), file, &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
return
}
tarPath = file.Name()
} }
tarPath = file.Name()
return return
} }