1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ionic.Zip;
using Microsoft.Azure.Management.AppService.Fluent;
using Microsoft.Azure.Management.Fluent;
using Tango.AzureUtils.Database;
using Tango.AzureUtils.Storage;
using Tango.BL;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.PMR.FirmwareUpgrade;
using Tango.PPC.Common.Publish;
namespace Tango.AzureUtils.Firmware
{
public class FirmwareManager : AzureUtilsComponentBase
{
private DatabaseManager _databaseManager;
private StorageManager _storageManager;
public FirmwareManager(IAzure azure) : base(azure)
{
_databaseManager = CreateManager<DatabaseManager>();
_storageManager = CreateManager<StorageManager>();
}
#region Firmware Injection
public async Task InjectFirmwarePackage(IWebAppBase slot, MachineTypes machineType, String tfpFile, String versionTag)
{
OnProgress(AzureUtilsStage.Firmware, $"Validating TFP package...");
VersionPackageDescriptor tfpPackage = null;
try
{
tfpPackage = await GetVersionPackageDescriptor(tfpFile);
tfpPackage.Validate();
}
catch (Exception ex)
{
throw new ValidationException($"The specified TFP package is invalid.\n{ex.FlattenMessage()}");
}
TangoVersion version = null;
if (machineType == MachineTypes.TS1800)
{
version = await _databaseManager.GetLatestPPCVersion(slot, null);
}
else if (machineType == MachineTypes.Eureka)
{
version = await _databaseManager.GetLatestEurekaVersion(slot, null);
}
else
{
throw new NotImplementedException("Machine type not supported for this action.");
}
if (Version.Parse(version.FirmwareVersion) >= tfpPackage.GetMcuVersion())
{
await RequestConfirmation($"The specified firmware version is '{tfpPackage.GetMcuVersion()}' while latest version is '{version.FirmwareVersion}'. Do you wish to continue?");
}
OnProgress(AzureUtilsStage.Firmware, $"Retrieving '{slot.Name}' settings...");
var settings = await slot.GetMachineServiceSettingsAsync();
await _storageManager.Connect(settings.STORAGE_ACCOUNT);
var zipFile = TemporaryManager.CreateImaginaryFile(".zip");
await _storageManager.DownloadLatestVersion(slot, machineType, zipFile, versionTag);
OnProgress(AzureUtilsStage.Firmware, $"Replacing firmware_package.tfp...");
await Task.Factory.StartNew(() =>
{
using (ZipFile zip = new ZipFile(zipFile))
{
var versionReader = zip.Entries.SingleOrDefault(x => x.FileName == "version.json").OpenReader();
String versionJson = null;
using (StreamReader reader = new StreamReader(versionReader))
{
versionJson = reader.ReadToEnd();
}
PublishInfo publishInfo = PublishInfo.FromJson(versionJson);
publishInfo.Firmware = tfpPackage;
zip.UpdateEntry("version.json", Encoding.Default.GetBytes(publishInfo.ToJson()));
zip.UpdateEntry("firmware_package.tfp", File.ReadAllBytes(tfpFile));
zip.Save();
}
});
await _storageManager.ReplaceLatestPPCVersion(slot, machineType, zipFile, versionTag);
OnProgress(AzureUtilsStage.Firmware, $"Updating firmware version on database...");
using (ObservablesContext db = ObservablesContext.CreateDefault(settings.ToDataSource()))
{
var v = await db.TangoVersions.SingleOrDefaultAsync(x => x.Guid == version.Guid);
v.FirmwareVersion = tfpPackage.GetMcuVersion().ToString();
await db.SaveChangesAsync();
}
OnCompleted("Firmware version injected successfully.");
}
public Task<VersionPackageDescriptor> GetVersionPackageDescriptor(String tfpFile)
{
return Task.Factory.StartNew(() =>
{
using (ZipFile zip = ZipFile.Read(tfpFile))
{
var reader = zip.Entries.SingleOrDefault(x => x.FileName == "package.cfg").OpenReader();
return VersionPackageDescriptor.Parser.ParseFrom(reader);
}
});
}
public async Task<String> GetFirmwareVersion(String tfpFile)
{
var desc = await GetVersionPackageDescriptor(tfpFile);
return desc.GetMcuVersion().ToString();
}
#endregion
}
}
|