aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Controllers
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-12-20 15:07:43 +0200
committerShlomo Hecht <shlomo@twine-s.com>2018-12-20 15:07:43 +0200
commit64367a944ebddc998b06eb2673928ef95ffc3627 (patch)
treeb30eff3671d388d23c10a91a82cc25a6d42d548f /Software/Visual_Studio/Web/Tango.MachineService/Controllers
parent4554080793bd46fcb8f55578d2f67917584dc332 (diff)
parentd204e56c57dcf52f31c9e64222f32a678150e721 (diff)
downloadTango-64367a944ebddc998b06eb2673928ef95ffc3627.tar.gz
Tango-64367a944ebddc998b06eb2673928ef95ffc3627.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/HomeController.cs16
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs186
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs (renamed from Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs)200
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/ValuesController.cs45
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs168
5 files changed, 344 insertions, 271 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/HomeController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/HomeController.cs
deleted file mode 100644
index a7c526f67..000000000
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/HomeController.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-using System.Web.Mvc;
-
-namespace Tango.MachineService.Controllers
-{
- public class HomeController : Controller
- {
- public String Index()
- {
- return "Machine Service Started!";
- }
- }
-}
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
new file mode 100644
index 000000000..245c18b9b
--- /dev/null
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Security.Authentication;
+using System.Web.Http;
+using Tango.BL;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.MachineService.Helpers;
+using Tango.MachineService.Models;
+using Tango.MachineStudio.Common.Update;
+
+namespace Tango.MachineService.Controllers
+{
+ public class MachineStudioController : JsonController
+ {
+ private static List<MachineStudioPendingUpload> _pendingUploads;
+
+ static MachineStudioController()
+ {
+ _pendingUploads = new List<MachineStudioPendingUpload>();
+ }
+
+ [HttpPost]
+ public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request)
+ {
+ LogManager.Log("Request received...");
+
+ CheckForUpdatesResponse response = new CheckForUpdatesResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ //Load relation first...
+ db.Roles.ToList();
+ db.Permissions.ToList();
+ db.UsersRoles.ToList();
+ db.RolesPermissions.ToList();
+
+ var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password);
+
+ if (user != null && user.HasPermission(Permissions.RunMachineStudio) || (request.Email == "ForceUpdate"))
+ {
+ var versions = db.MachineStudioVersions.ToList();
+
+ MachineStudioVersion latestVersion = null;
+
+ if (request.AcceptBetaRelease)
+ {
+ latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ }
+ else
+ {
+ latestVersion = versions.Where(x => x.Stable).OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ }
+
+ Version currentVersion = Version.Parse(request.Version);
+
+ bool isForcedUpdate = versions.Exists(x => x.ForceUpdate && Version.Parse(x.Version) > currentVersion);
+
+ String comments = String.Join(Environment.NewLine, versions.OrderBy(x => Version.Parse(x.Version)).Where(x => Version.Parse(x.Version) > currentVersion).Select(x => x.Comments));
+
+ if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersion)
+ {
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetMachineStudioVersionsContainer(client);
+ var blob = container.GetBlockBlobReference(latestVersion.BlobName);
+
+ response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60));
+
+ response.IsUpdateAvailable = true;
+ response.Version = latestVersion.Version;
+ response.Comments = latestVersion.Comments;
+ response.ForcedUpdate = isForcedUpdate;
+ response.IsStable = latestVersion.Stable;
+ }
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid user credentials.");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ public UploadVersionResponse UploadVersion(UploadVersionRequest request)
+ {
+ UploadVersionResponse response = new UploadVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ //Load relation first...
+ db.Roles.ToList();
+ db.Permissions.ToList();
+ db.UsersRoles.ToList();
+ db.RolesPermissions.ToList();
+
+ var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password);
+
+ if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersion))
+ {
+ var latestVersion = db.MachineStudioVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ Version currentVersion = Version.Parse(request.Version);
+
+ if (latestVersion == null || currentVersion > Version.Parse(latestVersion.Version))
+ {
+ String newVersionFileName = "Machine Studio Version" + " " + currentVersion.ToString() + ".zip";
+
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetMachineStudioVersionsContainer(client);
+ var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName);
+
+ response.Token = Guid.NewGuid().ToString();
+ response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30));
+
+ _pendingUploads.Add(new MachineStudioPendingUpload()
+ {
+ UserGuid = user.Guid,
+ Comments = request.Comments,
+ ForcedUpdate = request.ForcedUpdate,
+ Token = response.Token,
+ Version = request.Version,
+ IsStable = request.IsStable,
+ BlobName = blob.Name,
+ });
+ }
+ else
+ {
+ throw new ArgumentException("New version must be greater than latest version.");
+ }
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid user credentials.");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request)
+ {
+ MachineStudioPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
+
+ if (upload != null)
+ {
+ _pendingUploads.RemoveAll(x => x.Token == upload.Token);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ db.MachineStudioVersions.Add(new MachineStudioVersion()
+ {
+ Comments = upload.Comments,
+ BlobName = upload.BlobName,
+ UserGuid = upload.UserGuid,
+ Version = upload.Version,
+ ForceUpdate = upload.ForcedUpdate,
+ Stable = upload.IsStable,
+ });
+
+ db.SaveChanges();
+ }
+
+ return new UploadCompletedResponse();
+ }
+ else
+ {
+ throw new ArgumentException("Invalid Token.");
+ }
+ }
+
+ [HttpPost]
+ public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
+ {
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ var version = db.MachineStudioVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ return new LatestVersionResponse() { Version = version != null ? version.Version : "0.0.0.0" };
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs
index 304ea34f2..9ce22bbb0 100644
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs
@@ -17,6 +17,7 @@ using System.Web.Http;
using Tango.BL;
using Tango.BL.Builders;
using Tango.BL.Entities;
+using Tango.BL.Enumerations;
using Tango.Core.DB;
using Tango.Core.Helpers;
using Tango.Core.IO;
@@ -26,58 +27,28 @@ using Tango.MachineService.Models;
using Tango.MachineService.SMO;
using Tango.PMR.Stubs;
using Tango.PMR.Synchronization;
+using Tango.PPC.Common.MachineSetup;
+using Tango.PPC.Common.MachineUpdate;
+using Tango.PPC.Common.Update;
using Tango.Synchronization.Local;
using Tango.Synchronization.Remote;
namespace Tango.MachineService.Controllers
{
- public class SynchronizationController : ProtoController
+ public class PPCController : JsonController
{
- ///// <summary>
- ///// Expects a DB synchronization request from a remote machine and returns the synchronized version of the machine database.
- ///// </summary>
- ///// <param name="request">The request.</param>
- ///// <returns></returns>
- //[HttpPost]
- //public SynchronizeDBResponse Synchronize(SynchronizeDBRequest request)
- //{
- // var tempFolder = TemporaryManager.Default.CreateFolder();
+ private static List<PPCPendingUpload> _pendingUploads;
- // try
- // {
- // //File path for the reflected remote data base SQLite.
- // String masterSQLiteFile = Path.Combine(tempFolder, "Remote.db");
- // //File path for the received machine SQLite db.
- // String slaveSQLiteFile = Path.Combine(tempFolder, "Local.db");
+ #region Constructors
- // //Save the machine db to file.
- // File.WriteAllBytes(slaveSQLiteFile, request.LocalDB.ToByteArray());
-
- // //Copy an SQLite db template.
- // File.Copy(HostingEnvironment.MapPath(@"~/App_Data/Tango.db"), masterSQLiteFile);
-
- // //Synchronize the SQL Server db with the new SQLite template. (Overwrite basically)
- // RemoteDBSynchronizer.Synchronize(masterSQLiteFile, request.SerialNumber, true);
-
- // //Synchronize the received machine db with the filled template.
- // LocalDBSynchronizer.Synchronize(masterSQLiteFile, slaveSQLiteFile);
+ static PPCController()
+ {
+ _pendingUploads = new List<PPCPendingUpload>();
+ }
- // //Send the synchronized machine db to the machine to the machine.
- // SynchronizeDBResponse response = new SynchronizeDBResponse();
- // response.RemoteDB = ByteString.CopyFrom(File.ReadAllBytes(slaveSQLiteFile));
+ #endregion
- // return response;
- // }
- // catch (Exception)
- // {
- // throw;
- // }
- // finally
- // {
- // //Remove all temporary files and folder.
- // tempFolder.Delete();
- // }
- //}
+ #region Setup & Update
[HttpPost]
public MachineSetupResponse MachineSetup(MachineSetupRequest request)
@@ -98,6 +69,11 @@ namespace Tango.MachineService.Controllers
throw new AuthenticationException("The specified serial number could not be found.");
}
+ if (machine.SetupActivation && machine.OsKey == null)
+ {
+ throw new InvalidDataException("The specified machine is configured to perform an OS activation but is not associated with an OS activation key.");
+ }
+
var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
@@ -128,6 +104,13 @@ namespace Tango.MachineService.Controllers
response.DbAddress = Config.DB_ADDRESS;
response.DbUserName = credentials.UserName;
response.DbPassword = credentials.Password;
+ response.OSKey = machine.OsKey;
+ response.SetupActivation = machine.SetupActivation;
+ response.SetupRemoteAssistance = machine.SetupRemoteAssistance;
+ response.SetupUWF = machine.SetupUwf;
+ response.SetupFirmware = machine.SetupFirmware;
+ response.IsDemo = machine.IsDemo;
+
}
return response;
@@ -256,6 +239,139 @@ namespace Tango.MachineService.Controllers
return response;
}
+ #endregion
+
+ #region Version Upload
+
+ [HttpPost]
+ public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
+ {
+ LatestVersionResponse response = new LatestVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ var versions = db.TangoVersions.ToList();
+
+ if (versions.Count == 0)
+ {
+ return new LatestVersionResponse()
+ {
+ Version = "0.0.0.0",
+ };
+ }
+
+ var machine_versions = versions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList();
+
+ if (machine_versions.Count > 0)
+ {
+ response.Version = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault().Version;
+ }
+ else
+ {
+ throw new ArgumentException("The specified machine version was not found!");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ public UploadVersionResponse UploadVersion(UploadVersionRequest request)
+ {
+ UploadVersionResponse response = new UploadVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ //Load relations first...
+ db.Roles.ToList();
+ db.Permissions.ToList();
+ db.UsersRoles.ToList();
+ db.RolesPermissions.ToList();
+
+ var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password);
+
+ if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersion))
+ {
+ var versions = db.TangoVersions.ToList().Where(x => x.MachineVersionGuid == request.MachineVersionGuid).OrderByDescending(x => Version.Parse(x.Version)).ToList();
+
+ TangoVersion latestVersion = new TangoVersion();
+ latestVersion.Version = "0.0.0.0";
+
+ if (versions.Count > 0)
+ {
+ latestVersion = versions.FirstOrDefault();
+ }
+
+ Version currentVersion = Version.Parse(request.Version);
+
+ if (currentVersion > Version.Parse(latestVersion.Version))
+ {
+ String newVersionFileName = "Tango Version" + " " + currentVersion.ToString() + ".zip";
+
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetTangoVersionsContainer(client);
+ var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName);
+
+ response.Token = Guid.NewGuid().ToString();
+ response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30));
+
+ _pendingUploads.Add(new PPCPendingUpload()
+ {
+ UserGuid = user.Guid,
+ Comments = request.Comments,
+ Token = response.Token,
+ Version = request.Version,
+ BlobName = blob.Name,
+ MachineVersionGuid = request.MachineVersionGuid,
+ });
+ }
+ else
+ {
+ throw new ArgumentException("New version must be greater than latest version.");
+ }
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid user credentials.");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request)
+ {
+ PPCPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
+
+ if (upload != null)
+ {
+ _pendingUploads.RemoveAll(x => x.Token == upload.Token);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ db.TangoVersions.Add(new TangoVersion()
+ {
+ Comments = upload.Comments,
+ BlobName = upload.BlobName,
+ UserGuid = upload.UserGuid,
+ Version = upload.Version,
+ MachineVersionGuid = upload.MachineVersionGuid
+ });
+
+ db.SaveChanges();
+ }
+
+ return new UploadCompletedResponse();
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid upload token.");
+ }
+ }
+
+ #endregion
+
[HttpPost]
public Machine PersonTest(Person p)
{
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/ValuesController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/ValuesController.cs
deleted file mode 100644
index f76d66836..000000000
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/ValuesController.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Net.Http;
-using System.Web.Http;
-using Tango.MachineService.Models;
-
-namespace Tango.MachineService.Controllers
-{
- public class ValuesController : ApiController
- {
- private static List<Person> persons = new List<Person>();
-
- // GET api/values
- public IEnumerable<Person> Get()
- {
- return persons;
- }
-
- // GET api/values/5
- public Person Get(int id)
- {
- return persons[id];
- }
-
- // POST api/values
- public Person Post([FromBody]Person person)
- {
- persons.Add(person);
- return person;
- }
-
- // PUT api/values/5
- public void Put(Person person)
- {
-
- }
-
- // DELETE api/values/5
- public void Delete(int id)
- {
- }
- }
-}
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
deleted file mode 100644
index 2ad8bd735..000000000
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Net.Http;
-using System.Security.Authentication;
-using System.Web.Http;
-using Tango.BL;
-using Tango.BL.Entities;
-using Tango.BL.Enumerations;
-using Tango.Logging;
-using Tango.MachineService.Helpers;
-using Tango.PPC.Common.Update;
-
-namespace Tango.MachineService.Controllers
-{
- public class VersionUpdateController : JsonController
- {
- private class PendingUpload
- {
- public String Token { get; set; }
-
- public String Version { get; set; }
-
- public String UserGuid { get; set; }
-
- public String Comments { get; set; }
-
- public String MachineVersionGuid { get; set; }
-
- public String BlobName { get; set; }
- }
-
- private static List<PendingUpload> _pendingUploads;
-
- static VersionUpdateController()
- {
- _pendingUploads = new List<PendingUpload>();
- }
-
- [HttpPost]
- public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
- {
- LatestVersionResponse response = new LatestVersionResponse();
-
- using (ObservablesContext db = ObservablesContextHelper.CreateContext())
- {
- var versions = db.TangoVersions.ToList();
-
- if (versions.Count == 0)
- {
- return new LatestVersionResponse()
- {
- Version = "0.0.0.0",
- };
- }
-
- var machine_versions = versions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList();
-
- if (machine_versions.Count > 0)
- {
- response.Version = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault().Version;
- }
- else
- {
- throw new ArgumentException("The specified machine version was not found!");
- }
- }
-
- return response;
- }
-
- [HttpPost]
- public UploadVersionResponse UploadVersion(UploadVersionRequest request)
- {
- UploadVersionResponse response = new UploadVersionResponse();
-
- using (ObservablesContext db = ObservablesContextHelper.CreateContext())
- {
- //Load relations first...
- db.Roles.ToList();
- db.Permissions.ToList();
- db.UsersRoles.ToList();
- db.RolesPermissions.ToList();
-
- var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password);
-
- if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersion))
- {
- var versions = db.TangoVersions.ToList().Where(x => x.MachineVersionGuid == request.MachineVersionGuid).OrderByDescending(x => Version.Parse(x.Version)).ToList();
-
- TangoVersion latestVersion = new TangoVersion();
- latestVersion.Version = "0.0.0.0";
-
- if (versions.Count > 0)
- {
- latestVersion = versions.FirstOrDefault();
- }
-
- Version currentVersion = Version.Parse(request.Version);
-
- if (currentVersion > Version.Parse(latestVersion.Version))
- {
- String newVersionFileName = "Tango Version" + " " + currentVersion.ToString() + ".zip";
-
- var client = StorageHelper.GetStorageBlobClient();
- var container = StorageHelper.GetTangoVersionsContainer(client);
- var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName);
-
- response.Token = Guid.NewGuid().ToString();
- response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30));
-
- _pendingUploads.Add(new PendingUpload()
- {
- UserGuid = user.Guid,
- Comments = request.Comments,
- Token = response.Token,
- Version = request.Version,
- BlobName = blob.Name,
- MachineVersionGuid = request.MachineVersionGuid,
- });
- }
- else
- {
- throw new ArgumentException("New version must be greater than latest version.");
- }
- }
- else
- {
- throw new AuthenticationException("Invalid user credentials.");
- }
- }
-
- return response;
- }
-
- [HttpPost]
- public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request)
- {
- PendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
-
- if (upload != null)
- {
- _pendingUploads.RemoveAll(x => x.Token == upload.Token);
-
- using (ObservablesContext db = ObservablesContextHelper.CreateContext())
- {
- db.TangoVersions.Add(new TangoVersion()
- {
- Comments = upload.Comments,
- BlobName = upload.BlobName,
- UserGuid = upload.UserGuid,
- Version = upload.Version,
- MachineVersionGuid = upload.MachineVersionGuid
- });
-
- db.SaveChanges();
- }
-
- return new UploadCompletedResponse();
- }
- else
- {
- throw new AuthenticationException("Invalid upload token.");
- }
- }
- }
-}