diff options
| author | Shlomo Hecht <shlomo@twine-s.com> | 2018-11-25 10:44:37 +0200 |
|---|---|---|
| committer | Shlomo Hecht <shlomo@twine-s.com> | 2018-11-25 10:44:37 +0200 |
| commit | beff6af103bb0ae9b9147a907c6567bdb33abd00 (patch) | |
| tree | 375eefd654c25f3b68c0cf5b3612df844a140d8e /Software/Visual_Studio/Web/Tango.MachineService/Controllers | |
| parent | 57f20269fbb4c591aa73c9f5e50118310cc4892e (diff) | |
| parent | dff24e56a8906b8c9b355cf407f25f4b793beafe (diff) | |
| download | Tango-beff6af103bb0ae9b9147a907c6567bdb33abd00.tar.gz Tango-beff6af103bb0ae9b9147a907c6567bdb33abd00.zip | |
merge
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
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."); + } + } + } +} |
