using Microsoft.Win32; using MySql.Data.Entity; using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Globalization; using System.IO; using System.Linq; using System.ServiceProcess; using Thermo.Active.Database.Controllers; using Thermo.Active.Database.Migrations; using Thermo.Active.Model.DatabaseModels; using static Thermo.Active.Config.ServerConfig; using static Thermo.Active.Model.Constants; using static Thermo.Active.Utils.ExceptionManager; namespace Thermo.Active.Database { [DbConfigurationType(typeof(MySqlEFConfiguration))] public class DatabaseContext : DbContext { public DbSet Users { get; set; } public DbSet Machines { get; set; } public DbSet MachinesUsers { get; set; } public DbSet Roles { get; set; } public DbSet FunctionsAccess { get; set; } public DbSet Sessions { get; set; } public DbSet FavoriteUserSoftkeys { get; set; } public DbSet KeyboardUserSoftkeys { get; set; } // Maintenances public DbSet Maintenances { get; set; } public DbSet PerformedMaintenances { get; set; } public DbSet MaintenancesNotes { get; set; } public DbSet MaintenanceFiles { get; set; } // Tool tables public DbSet Families { get; set; } public DbSet Queue { get; set; } // Alarms public DbSet AlarmDescriptions { get; set; } public DbSet AlarmOccurrences { get; set; } public DbSet AlarmUsers { get; set; } public DbSet AlarmsNotes { get; set; } public DbSet AlarmFiles { get; set; } // thermo! public DbSet ProdInfo { get; set; } public DbSet HistorySheet { get; set; } // Create migration string public static string CONNECTION_STRING = "Server = " + "localhost" + "; Database=" + DATABASE_NAME + ";Uid=" + DATABASE_USER + ";Pwd=" + DATABASE_PWD + ";"; // public static string CONNECTION_STRING = "Server = " + ServerStartupConfig.DatabaseAddress + "; Database=" + DATABASE_NAME +";Uid="+ DATABASE_USER +";Pwd="+ DATABASE_PWD +";"; public DatabaseContext() : base(CONNECTION_STRING) { } public static DatabaseContext Create() { return new DatabaseContext(); } public static bool SetUpDbConnectionAndDbConfig() { try { String serviceName = getDbServiceName(); if(serviceName.Equals("")) { ManageError(ERROR_LEVEL.FATAL, "Database SQL service not found", true); return false; } String serviceRedisName = getRedisServiceName(); if (serviceRedisName.Equals("")) { ManageError(ERROR_LEVEL.FATAL, "Database REDIS service not found", true); return false; } ServiceController service = new ServiceController(serviceName); try { TimeSpan timeout = TimeSpan.FromSeconds(DATABASE_PROCESS_TIMEOUT); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception ex) { ManageError(ERROR_LEVEL.FATAL, "Database SQL not started", true); return false; } service = new ServiceController(serviceRedisName); try { TimeSpan timeout = TimeSpan.FromSeconds(DATABASE_PROCESS_TIMEOUT); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } catch (Exception e) { ManageError(ERROR_LEVEL.FATAL, "Database REDIS not started", true); return false; } System.Data.Entity.Database.SetInitializer(null); var migrator = new DbMigrator(new Configuration()); if (migrator.GetPendingMigrations().Any()) { // Run migrations and seed. migrator.Update(); } FindOrCreateMachineUniqueId(); using (MaintenancesController maintenancesController = new MaintenancesController()) { maintenancesController.CheckDifferencesFromDbAndXml(); } // Get functionality and PLC default false functionality using (FunctionsAccessController functionsAccess = new FunctionsAccessController()) { FunctionsAccessConfig = functionsAccess.FindAll(); AllFunctionalityDisabled = functionsAccess.FindAllFunctionsAndDisableAll(); } using (QueueController queueController = new QueueController()) queueController.ReadAndPopulateQueue(); } catch (Exception ex) { ManageException(ERROR_LEVEL.FATAL, ex); return false; } return true; } private static void FindOrCreateMachineUniqueId() { // Find machine unique id in the register string uniqueId = ReadUniqueIdFromRegister(); // If not found if (uniqueId == null || uniqueId == "") { if (!File.Exists("uniqueid.txt")) { uniqueId = Guid.NewGuid().ToString(); // Save uinique id into file File.WriteAllText("uniqueid.txt", uniqueId); // Save uinique id in the registry WriteUniqueIdIntoRegister(uniqueId); } else { // Find machine unique id in the storage file uniqueId = File.ReadAllText("uniqueid.txt"); // If null or empty if (uniqueId == null || uniqueId == "") { // Delete empty file and recreate File.Delete(uniqueId); FindOrCreateMachineUniqueId(); return; } else { WriteUniqueIdIntoRegister(uniqueId); } } } // Set machine info into static server config using (MachinesController machinesController = new MachinesController()) { MachineConfig = machinesController.FindMachineByUniqueId(uniqueId); if (MachineConfig == null) { // Create Machine inside database MachineConfig = machinesController.Create(uniqueId); using (UsersController usersController = new UsersController()) { // Create default CMS user usersController.CreateCmsDefaultUserIfNotExists(MachineConfig.MachineId, "cms.service", "cmsserviceonly", "cms", "service", new CultureInfo("it"), ROLE_IDS.CMS_SERVICE); usersController.CreateCmsDefaultUserIfNotExists(MachineConfig.MachineId, "cms.ut", "cmsufficiotecnico", "cms", "ut", new CultureInfo("it"), ROLE_IDS.CMS_UT); // Create default CUSTOMER user usersController.CreateCmsDefaultUserIfNotExists(MachineConfig.MachineId, "admin", "admin", "customer", "admin", Config.ServerConfig.ServerStartupConfig.Language, ROLE_IDS.CUSTOMER_ADMIN); usersController.CreateCmsDefaultUserIfNotExists(MachineConfig.MachineId, "operator", "operator", "customer", "operator", Config.ServerConfig.ServerStartupConfig.Language, ROLE_IDS.CUSTOMER_OPERATOR); usersController.CreateCmsDefaultUserIfNotExists(MachineConfig.MachineId, "maintainer", "maintainer", "customer", "maintainer", Config.ServerConfig.ServerStartupConfig.Language, ROLE_IDS.CUSTOMER_MAINTAINER); } } else { // if config name is different than dabase name, update db if (MachineConfig.Model != NcConfig.NcName) machinesController.UpdateMachineName(MachineConfig.MachineId, NcConfig.NcName); } } } private static void WriteUniqueIdIntoRegister(string uniqueId) { // Get path to the HKEY_LOCAL_MACHINE/SOFTWARE RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE", true); // Create or get ..//CMS/Step subkey key = key.CreateSubKey("Cms").CreateSubKey("Active"); // Set machine unique id Key key.SetValue(REGISTER_MACHINE_ID_KEY_NAME, uniqueId); } private static string ReadUniqueIdFromRegister() { // Get path to the HKEY_LOCAL_MACHINE/SOFTWARE RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE", true); // Get ..//CMS/Step subkey key = key.CreateSubKey("Cms").CreateSubKey("Active"); // Return value return (string)key.GetValue(REGISTER_MACHINE_ID_KEY_NAME); } private static string getDbServiceName() { ServiceController[] services = ServiceController.GetServices(); var service = services.FirstOrDefault(s => s.ServiceName == "MariaDB"); if (service != null) return service.DisplayName; service = services.FirstOrDefault(s => s.ServiceName == "MySQL"); if (service != null) return service.DisplayName; return ""; } private static string getRedisServiceName() { ServiceController[] services = ServiceController.GetServices(); var service = services.FirstOrDefault(s => s.ServiceName == "Redis"); if (service != null) return service.DisplayName; return ""; } } }