internal/scanners/pep.go (58 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package scanners
import (
"github.com/Azure/azqr/internal/models"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6"
"github.com/rs/zerolog/log"
)
// PrivateEndpointScanner - Scanner for Private Endpoints
type PrivateEndpointScanner struct {
config *models.ScannerConfig
client *armnetwork.PrivateEndpointsClient
hasPrivateEndpointFunc func() (map[string]bool, error)
}
// Init - Initializes the PrivateEndpointScanner
func (s *PrivateEndpointScanner) Init(config *models.ScannerConfig) error {
s.config = config
var err error
s.client, err = armnetwork.NewPrivateEndpointsClient(s.config.SubscriptionID, s.config.Cred, config.ClientOptions)
if err != nil {
return err
}
return nil
}
// ListResourcesWithPrivateEndpoints - Lists all resources with private endpoints
func (s *PrivateEndpointScanner) ListResourcesWithPrivateEndpoints() (map[string]bool, error) {
models.LogSubscriptionScan(s.config.SubscriptionID, "Private Endpoints")
res := map[string]bool{}
if s.hasPrivateEndpointFunc == nil {
opt := armnetwork.PrivateEndpointsClientListBySubscriptionOptions{}
pager := s.client.NewListBySubscriptionPager(&opt)
for pager.More() {
resp, err := pager.NextPage(s.config.Ctx)
if err != nil {
return nil, err
}
for _, v := range resp.Value {
for _, c := range v.Properties.PrivateLinkServiceConnections {
if len(*c.Properties.PrivateLinkServiceID) > 0 {
res[*c.Properties.PrivateLinkServiceID] = true
}
}
}
}
return res, nil
}
return s.hasPrivateEndpointFunc()
}
func (s *PrivateEndpointScanner) Scan(config *models.ScannerConfig) map[string]bool {
err := s.Init(config)
if err != nil {
log.Fatal().Err(err).Msg("Failed to initialize Private Endpoint Scanner")
}
peResults, err := s.ListResourcesWithPrivateEndpoints()
if err != nil {
if models.ShouldSkipError(err) {
peResults = map[string]bool{}
} else {
log.Fatal().Err(err).Msg("Failed to list resources with Private Endpoints")
}
}
return peResults
}