aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Controllers
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-11-25 10:44:37 +0200
committerShlomo Hecht <shlomo@twine-s.com>2018-11-25 10:44:37 +0200
commitbeff6af103bb0ae9b9147a907c6567bdb33abd00 (patch)
tree375eefd654c25f3b68c0cf5b3612df844a140d8e /Software/Visual_Studio/Web/Tango.MachineService/Controllers
parent57f20269fbb4c591aa73c9f5e50118310cc4892e (diff)
parentdff24e56a8906b8c9b355cf407f25f4b793beafe (diff)
downloadTango-beff6af103bb0ae9b9147a907c6567bdb33abd00.tar.gz
Tango-beff6af103bb0ae9b9147a907c6567bdb33abd00.zip
merge
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs344
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs158
2 files changed, 299 insertions, 203 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs
index 51cf6f96b..304ea34f2 100644
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs
@@ -1,4 +1,7 @@
using Google.Protobuf;
+using Microsoft.Azure;
+using Microsoft.Azure.Management.Sql;
+using Microsoft.SqlServer.Management.Smo;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
@@ -7,6 +10,7 @@ using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
+using System.Security.Authentication;
using System.Threading.Tasks;
using System.Web.Hosting;
using System.Web.Http;
@@ -17,7 +21,9 @@ using Tango.Core.DB;
using Tango.Core.Helpers;
using Tango.Core.IO;
using Tango.Logging;
+using Tango.MachineService.Helpers;
using Tango.MachineService.Models;
+using Tango.MachineService.SMO;
using Tango.PMR.Stubs;
using Tango.PMR.Synchronization;
using Tango.Synchronization.Local;
@@ -25,112 +31,103 @@ using Tango.Synchronization.Remote;
namespace Tango.MachineService.Controllers
{
- public class SynchronizationController : ApiController
+ public class SynchronizationController : ProtoController
{
- private LogManager logManager = LogManager.Default;
+ ///// <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();
- /// <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();
+ // 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");
- 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");
+ // //Save the machine db to file.
+ // File.WriteAllBytes(slaveSQLiteFile, request.LocalDB.ToByteArray());
- //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);
- //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 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);
- //Synchronize the received machine db with the filled template.
- LocalDBSynchronizer.Synchronize(masterSQLiteFile, slaveSQLiteFile);
+ // //Send the synchronized machine db to the machine to the machine.
+ // SynchronizeDBResponse response = new SynchronizeDBResponse();
+ // response.RemoteDB = ByteString.CopyFrom(File.ReadAllBytes(slaveSQLiteFile));
- //Send the synchronized machine db to the machine to the machine.
- SynchronizeDBResponse response = new SynchronizeDBResponse();
- response.RemoteDB = ByteString.CopyFrom(File.ReadAllBytes(slaveSQLiteFile));
-
- return response;
- }
- catch (Exception)
- {
- throw;
- }
- finally
- {
- //Remove all temporary files and folder.
- tempFolder.Delete();
- }
- }
+ // return response;
+ // }
+ // catch (Exception)
+ // {
+ // throw;
+ // }
+ // finally
+ // {
+ // //Remove all temporary files and folder.
+ // tempFolder.Delete();
+ // }
+ //}
[HttpPost]
public MachineSetupResponse MachineSetup(MachineSetupRequest request)
{
MachineSetupResponse response = new MachineSetupResponse();
- logManager.Log("Setup request received: " + request.ToString());
+ LogManager.Log("Setup request received: " + request.ToString());
- try
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
- using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress()))
+ db.Configuration.LazyLoadingEnabled = false;
+ String serial_number = request.SerialNumber;
+
+ var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
+
+ if (machine == null)
{
- db.Configuration.LazyLoadingEnabled = false;
- String serial_number = request.SerialNumber;
+ throw new AuthenticationException("The specified serial number could not be found.");
+ }
- var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
+ var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
- if (machine == null)
- {
- ThrowError(HttpStatusCode.NotFound, "The specified serial number could not be found.");
- }
+ var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
- var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
+ response.Version = latest_machine_version.Version;
- var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetTangoVersionsContainer(client);
+ var blob = container.GetBlockBlobReference(latest_machine_version.BlobName);
- response.Version = latest_machine_version.Version;
+ response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60));
- response.FtpAddress = GetFtpAddress();
- response.FtpFilePath = latest_machine_version.FtpFilePath;
- response.FtpUserName = GetFtpUserName();
- response.FtpPassword = GetFtpPassword();
+ DbCredentials credentials = new DbCredentials();
- DbCredentials credentials = new DbCredentials();
+ using (SmoManager manager = new SmoManager())
+ {
+ credentials = manager.CreateRandomLoginAndUser();
- using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
+ Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
{
- credentials = manager.CreateRandomLoginAndUser("Tango");
-
- Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
+ using (SmoManager m = new SmoManager())
{
- using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
- {
- m.DeleteLoginAndUser(credentials.UserName, "Tango");
- }
- });
- }
-
- response.DbAddress = GetDbAddress();
- response.DbUserName = credentials.UserName;
- response.DbPassword = credentials.Password;
+ m.DeleteLoginAndUser(credentials.UserName);
+ }
+ });
}
- }
- catch (Exception ex)
- {
- logManager.Log(ex);
- throw;
+
+ response.DbAddress = Config.DB_ADDRESS;
+ response.DbUserName = credentials.UserName;
+ response.DbPassword = credentials.Password;
}
return response;
@@ -141,54 +138,48 @@ namespace Tango.MachineService.Controllers
{
DownloadUpdateResponse response = new DownloadUpdateResponse();
- try
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
- using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress()))
+ db.Configuration.LazyLoadingEnabled = false;
+ String serial_number = request.SerialNumber;
+
+ var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
+
+ if (machine == null)
{
- db.Configuration.LazyLoadingEnabled = false;
- String serial_number = request.SerialNumber;
+ throw new AuthenticationException("The specified serial number could not be found.");
+ }
- var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
+ var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
- if (machine == null)
- {
- OnError(HttpStatusCode.NotFound, "The specified serial number could not be found.");
- }
+ var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
- var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
+ response.Version = latest_machine_version.Version;
- var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetTangoVersionsContainer(client);
+ var blob = container.GetBlockBlobReference(latest_machine_version.BlobName);
- response.Version = latest_machine_version.Version;
+ response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60));
- response.FtpAddress = GetFtpAddress();
- response.FtpFilePath = latest_machine_version.FtpFilePath;
- response.FtpUserName = GetFtpUserName();
- response.FtpPassword = GetFtpPassword();
+ DbCredentials credentials = new DbCredentials();
- DbCredentials credentials = new DbCredentials();
+ using (SmoManager manager = new SmoManager())
+ {
+ credentials = manager.CreateRandomLoginAndUser();
- using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
+ Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
{
- credentials = manager.CreateRandomLoginAndUser("Tango");
-
- Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
+ using (SmoManager m = new SmoManager())
{
- using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
- {
- m.DeleteLoginAndUser(credentials.UserName, "Tango");
- }
- });
- }
-
- response.DbAddress = GetDbAddress();
- response.DbUserName = credentials.UserName;
- response.DbPassword = credentials.Password;
+ m.DeleteLoginAndUser(credentials.UserName);
+ }
+ });
}
- }
- catch (Exception ex)
- {
- OnError(HttpStatusCode.InternalServerError, ex.Message);
+
+ response.DbAddress = Config.DB_ADDRESS;
+ response.DbUserName = credentials.UserName;
+ response.DbPassword = credentials.Password;
}
return response;
@@ -199,34 +190,27 @@ namespace Tango.MachineService.Controllers
{
CheckForUpdateResponse response = new CheckForUpdateResponse();
- try
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
- using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress()))
- {
- db.Configuration.LazyLoadingEnabled = false;
+ db.Configuration.LazyLoadingEnabled = false;
- var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber);
-
- if (machine == null)
- {
- OnError(HttpStatusCode.NotFound, "The specified serial number could not be found.");
- }
+ var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber);
- var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
+ if (machine == null)
+ {
+ throw new AuthenticationException("The specified serial number could not be found.");
+ }
- var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid);
- if (Version.Parse(latest_machine_version.Version) > Version.Parse(request.Version))
- {
- response.IsUpdateAvailable = true;
- }
+ var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
- response.Version = latest_machine_version.Version;
+ if (Version.Parse(latest_machine_version.Version) > Version.Parse(request.Version))
+ {
+ response.IsUpdateAvailable = true;
}
- }
- catch (Exception ex)
- {
- OnError(HttpStatusCode.InternalServerError, ex.Message);
+
+ response.Version = latest_machine_version.Version;
}
return response;
@@ -237,43 +221,36 @@ namespace Tango.MachineService.Controllers
{
UpdateDBResponse response = new UpdateDBResponse();
- try
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
- using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress()))
- {
- db.Configuration.LazyLoadingEnabled = false;
- String serial_number = request.SerialNumber;
+ db.Configuration.LazyLoadingEnabled = false;
+ String serial_number = request.SerialNumber;
- var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
+ var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == serial_number);
- if (machine == null)
- {
- OnError(HttpStatusCode.NotFound, "The specified serial number could not be found.");
- }
+ if (machine == null)
+ {
+ throw new AuthenticationException("The specified serial number could not be found.");
+ }
- DbCredentials credentials = new DbCredentials();
+ DbCredentials credentials = new DbCredentials();
- using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
- {
- credentials = manager.CreateRandomLoginAndUser("Tango");
+ using (SmoManager manager = new SmoManager())
+ {
+ credentials = manager.CreateRandomLoginAndUser();
- Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
+ Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) =>
+ {
+ using (SmoManager m = new SmoManager())
{
- using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango"))
- {
- m.DeleteLoginAndUser(credentials.UserName, "Tango");
- }
- });
- }
-
- response.DbAddress = GetDbAddress();
- response.DbUserName = credentials.UserName;
- response.DbPassword = credentials.Password;
+ m.DeleteLoginAndUser(credentials.UserName);
+ }
+ });
}
- }
- catch (Exception ex)
- {
- OnError(HttpStatusCode.InternalServerError, ex.Message);
+
+ response.DbAddress = Config.DB_ADDRESS;
+ response.DbUserName = credentials.UserName;
+ response.DbPassword = credentials.Password;
}
return response;
@@ -282,7 +259,7 @@ namespace Tango.MachineService.Controllers
[HttpPost]
public Machine PersonTest(Person p)
{
- using (var db = ObservablesContext.CreateDefault(GetLocalServerAddress()))
+ using (var db = ObservablesContextHelper.CreateContext())
{
var machine = new MachineBuilder(db)
.Set(x => x.SerialNumber == "1111")
@@ -292,44 +269,5 @@ namespace Tango.MachineService.Controllers
return machine;
}
}
-
- #region Helpers
-
- private void ThrowError(HttpStatusCode code, String message)
- {
- throw new WebApiException(code, message);
- }
-
- private void OnError(HttpStatusCode code, String message)
- {
- throw new HttpResponseException(Request.CreateErrorResponse(code, message));
- }
-
- private String GetLocalServerAddress()
- {
- return ConfigurationManager.AppSettings["LocalServerAddress"].ToString();
- }
-
- private String GetDbAddress()
- {
- return ConfigurationManager.AppSettings["DbAddress"].ToString();
- }
-
- private String GetFtpAddress()
- {
- return ConfigurationManager.AppSettings["FtpAddress"].ToString();
- }
-
- private String GetFtpUserName()
- {
- return ConfigurationManager.AppSettings["FtpUserName"].ToString();
- }
-
- private String GetFtpPassword()
- {
- return ConfigurationManager.AppSettings["FtpPassword"].ToString();
- }
-
- #endregion
}
}
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
new file mode 100644
index 000000000..b68da06a7
--- /dev/null
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
@@ -0,0 +1,158 @@
+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.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList();
+
+ if (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.");
+ }
+ }
+ }
+}