From b3f99806cae896668f5a78bd204a36a77957ff66 Mon Sep 17 00:00:00 2001 From: sleevezipper Date: Sun, 3 Jan 2021 02:55:44 +0100 Subject: [PATCH] stop using isolated storage and use AppData/local for config and logs --- .vs/hass-workstation-service/v16/.suo | Bin 272384 -> 279552 bytes .../Data/ConfigurationService.cs | 27 ++++++++---------- hass-workstation-service/Program.cs | 7 ++++- .../PublishProfiles/AzureHosted.pubxml | 2 +- hass-workstation-service/UserInterface.exe | Bin 29713260 -> 29713772 bytes 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/.vs/hass-workstation-service/v16/.suo b/.vs/hass-workstation-service/v16/.suo index 2f5456d313c8b2128ad28663a8e325a7cd839454..cf4766f05e5ebd524a72e4c117f181a826e866f3 100644 GIT binary patch delta 6112 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 - - if (!this._fileStorage.FileExists("mqttbroker.json")) + if (!File.Exists(Path.Combine(path, "mqttbroker.json"))) { - this._fileStorage.CreateFile("mqttbroker.json"); + File.Create(Path.Combine(path, "mqttbroker.json")); } - if (!this._fileStorage.FileExists("configured-sensors.json")) + if (!File.Exists(Path.Combine(path, "configured-sensors.json"))) { - this._fileStorage.CreateFile("configured-sensors.json"); + File.Create(Path.Combine(path, "configured-sensors.json")); } + + ConfiguredSensors = new List(); } public async void ReadSensorSettings(MqttPublisher publisher) @@ -54,7 +51,7 @@ public async void ReadSensorSettings(MqttPublisher publisher) } this._sensorsSettingsFileLocked = true; List sensors = new List(); - using (var stream = this._fileStorage.OpenFile("configured-sensors.json", FileMode.Open)) + using (var stream = new FileStream(Path.Combine(path, "configured-sensors.json"), FileMode.Open)) { Log.Logger.Information($"reading configured sensors from: {stream.Name}"); if (stream.Length > 0) @@ -134,7 +131,7 @@ public async Task ReadMqttSettingsAsync() } this._brokerSettingsFileLocked = true; ConfiguredMqttBroker configuredBroker = null; - using (IsolatedStorageFileStream stream = this._fileStorage.OpenFile("mqttbroker.json", FileMode.Open)) + using (FileStream stream = new FileStream(Path.Combine(path, "mqttbroker.json"), FileMode.Open)) { Log.Logger.Information($"reading configured mqttbroker from: {stream.Name}"); if (stream.Length > 0) @@ -156,7 +153,7 @@ public async void WriteSettingsAsync() } this._sensorsSettingsFileLocked = true; List configuredSensorsToSave = new List(); - using (IsolatedStorageFileStream stream = this._fileStorage.OpenFile("configured-sensors.json", FileMode.Open)) + using (FileStream stream = new FileStream(Path.Combine(path, "configured-sensors.json"), FileMode.Open)) { stream.SetLength(0); Log.Logger.Information($"writing configured sensors to: {stream.Name}"); @@ -171,7 +168,7 @@ public async void WriteSettingsAsync() { configuredSensorsToSave.Add(new ConfiguredSensor() { Id = sensor.Id, Name = sensor.Name, Type = sensor.GetType().Name, UpdateInterval = sensor.UpdateInterval }); } - + } await JsonSerializer.SerializeAsync(stream, configuredSensorsToSave); @@ -220,7 +217,7 @@ public async void WriteMqttBrokerSettingsAsync(MqttSettings settings) await Task.Delay(500); } this._brokerSettingsFileLocked = true; - using (IsolatedStorageFileStream stream = this._fileStorage.OpenFile("mqttbroker.json", FileMode.Open)) + using (FileStream stream = new FileStream(Path.Combine(path, "mqttbroker.json"), FileMode.Open)) { stream.SetLength(0); Log.Logger.Information($"writing configured mqttbroker to: {stream.Name}"); diff --git a/hass-workstation-service/Program.cs b/hass-workstation-service/Program.cs index 8ee7285..3be2fbb 100644 --- a/hass-workstation-service/Program.cs +++ b/hass-workstation-service/Program.cs @@ -26,10 +26,15 @@ public class Program { public static async Task Main(string[] args) { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Hass Workstation Service", "logs"); + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Console() - .WriteTo.File(new RenderedCompactJsonFormatter(), "logs/log.ndjson") + .WriteTo.File(new RenderedCompactJsonFormatter(), Path.Combine(path, "log.txt"), rollingInterval: RollingInterval.Day) .CreateLogger(); // We do it this way because there is currently no way to pass an argument to a dotnet core app when using clickonce if (Process.GetProcessesByName("hass-workstation-service").Count() > 1) //bg service running diff --git a/hass-workstation-service/Properties/PublishProfiles/AzureHosted.pubxml b/hass-workstation-service/Properties/PublishProfiles/AzureHosted.pubxml index 0f34205..35da0ec 100644 --- a/hass-workstation-service/Properties/PublishProfiles/AzureHosted.pubxml +++ b/hass-workstation-service/Properties/PublishProfiles/AzureHosted.pubxml @@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - 23 + 25 1.0.0.* True Release diff --git a/hass-workstation-service/UserInterface.exe b/hass-workstation-service/UserInterface.exe index be08cbb10fd107862a5a570102b0fedb95505d06..86049d1187bfed13fd3855baecdb5a0137970a01 100644 GIT binary patch delta 11300 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