in flag.go [359:493]
func (f FlagSet) BuildCommonConfig() (config.CommonConfig, error) {
// Logger is only enabled when the log path is specified.
// This is because either interactive/non-interactive mode controls the terminal rendering,
// logging to stdout/stderr will impact the rendering.
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
if path := f.flagLogPath; path != "" {
level, err := logLevel(f.flagLogLevel)
if err != nil {
return config.CommonConfig{}, err
}
// #nosec G304
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
if err != nil {
return config.CommonConfig{}, fmt.Errorf("creating log file %s: %v", path, err)
}
logger = slog.New(slog.NewTextHandler(f, &slog.HandlerOptions{Level: level}))
// Enable log for azure sdk
os.Setenv("AZURE_SDK_GO_LOGGING", "all") // #nosec G104
azlog.SetListener(func(cls azlog.Event, msg string) {
logger.Log(context.Background(), log.LevelTrace, msg, "event", cls)
})
}
authConfig, err := f.buildAuthConfig()
if err != nil {
return config.CommonConfig{}, err
}
var cloudCfg cloud.Configuration
switch env := f.flagEnv; strings.ToLower(env) {
case "public":
cloudCfg = cloud.AzurePublic
case "usgovernment":
cloudCfg = cloud.AzureGovernment
case "china":
cloudCfg = cloud.AzureChina
default:
return config.CommonConfig{}, fmt.Errorf("unknown environment specified: %q", env)
}
clientOpt := arm.ClientOptions{
ClientOptions: policy.ClientOptions{
Cloud: cloudCfg,
Telemetry: policy.TelemetryOptions{
ApplicationID: fmt.Sprintf("aztfexport(%s)", f.flagProviderName),
Disabled: false,
},
Logging: policy.LogOptions{
IncludeBody: true,
},
},
AuxiliaryTenants: authConfig.AuxiliaryTenantIDs,
DisableRPRegistration: true,
}
cred, err := NewDefaultAzureCredential(*logger, &DefaultAzureCredentialOptions{
AuthConfig: *authConfig,
ClientOptions: clientOpt.ClientOptions,
DisableInstanceDiscovery: false,
SendCertificateChain: false,
})
if err != nil {
return config.CommonConfig{}, fmt.Errorf("failed to new credential: %v", err)
}
excludeAzureResource := f.flagExcludeAzureResource.Value()
if p := f.flagExcludeAzureResourceFile; p != "" {
// #nosec G304
f, err := os.Open(p)
if err != nil {
return config.CommonConfig{}, fmt.Errorf("opening %s: %v", p, err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
v := strings.TrimSpace(scanner.Text())
excludeAzureResource = append(excludeAzureResource, v)
}
}
excludeTerraformResource := f.flagExcludeTerraformResource.Value()
if p := f.flagExcludeTerraformResourceFile; p != "" {
// #nosec G304
f, err := os.Open(p)
if err != nil {
return config.CommonConfig{}, fmt.Errorf("opening %s: %v", p, err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
v := strings.TrimSpace(scanner.Text())
excludeTerraformResource = append(excludeTerraformResource, v)
}
}
cfg := config.CommonConfig{
Logger: logger,
AuthConfig: *authConfig,
SubscriptionId: f.flagSubscriptionId,
AzureSDKCredential: cred,
AzureSDKClientOption: clientOpt,
OutputDir: f.flagOutputDir,
ProviderVersion: f.flagProviderVersion,
ProviderName: f.flagProviderName,
DevProvider: f.flagDevProvider,
ContinueOnError: f.flagContinue,
BackendType: f.flagBackendType,
BackendConfig: f.flagBackendConfig.Value(),
FullConfig: f.flagFullConfig,
MaskSensitive: f.flagMaskSensitive,
Parallelism: f.flagParallelism,
HCLOnly: f.flagHCLOnly,
ModulePath: f.flagModulePath,
GenerateImportBlock: f.flagGenerateImportBlock,
TelemetryClient: initTelemetryClient(f.flagSubscriptionId),
ExcludeAzureResources: excludeAzureResource,
ExcludeTerraformResources: excludeTerraformResource,
}
if f.flagAppend {
cfg.OutputFileNames = config.OutputFileNames{
TerraformFileName: "terraform.aztfexport.tf",
ProviderFileName: "provider.aztfexport.tf",
MainFileName: "main.aztfexport.tf",
ImportBlockFileName: "import.aztfexport.tf",
}
}
return cfg, nil
}