using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace StardewModdingAPI.Web.Framework
{
/// Reads configuration values from the AWS Beanstalk environment properties file (if present).
/// This is a workaround for AWS Beanstalk injection not working with .NET Core apps.
internal class BeanstalkEnvPropsConfigProvider : ConfigurationProvider, IConfigurationSource
{
/*********
** Properties
*********/
/// The absolute path to the container configuration file on an Amazon EC2 instance.
private const string ContainerConfigPath = @"C:\Program Files\Amazon\ElasticBeanstalk\config\containerconfiguration";
/*********
** Public methods
*********/
/// Build the configuration provider for this source.
/// The configuration builder.
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new BeanstalkEnvPropsConfigProvider();
}
/// Load the environment properties.
public override void Load()
{
this.Data = new Dictionary(StringComparer.OrdinalIgnoreCase);
// get Beanstalk config file
FileInfo file = new FileInfo(BeanstalkEnvPropsConfigProvider.ContainerConfigPath);
if (!file.Exists)
return;
// parse JSON
JObject jsonRoot = (JObject)JsonConvert.DeserializeObject(File.ReadAllText(file.FullName));
if (jsonRoot["iis"]?["env"] is JArray jsonProps)
{
foreach (string prop in jsonProps.Values())
{
string[] parts = prop.Split('=', 2); // key=value
if (parts.Length == 2)
this.Data[parts[0]] = parts[1];
}
}
}
}
}