Esempio n. 1
0
        public void AddSettingsEntry(string key, object value, string group, PropertyTemplateType type, bool isVisible)
        {
            var settings    = Db.Settings.SingleOrDefault(a => a.ValueKey == key);
            var isNewObject = false;

            if (settings == null)
            {
                settings = new Setting
                {
                    ValueKey = key,
                    Value    = value
                };
                isNewObject = true;
            }
            settings.Type      = (long)type;
            settings.IsVisible = isVisible;
            settings.Group     = group;

            if (isNewObject)
            {
                Db.Settings.Add(settings);
            }
            else
            {
                Db.Settings.Update(settings);
            }
            Db.SaveChanges();
        }
Esempio n. 2
0
 public void Add(Trending value, NodeInstance nodeInstance)
 {
     using var context = new AutomaticaContext(_config);
     _logger.LogInformation($"Save trend for {nodeInstance.Name} ({nodeInstance.ObjId}) with value {value.Value}...");
     context.Add(value);
     context.SaveChanges();
 }
Esempio n. 3
0
        public void TestGenerateIfNotExists()
        {
            var categoryGroupId = Guid.NewGuid();

            using (var dbContext = new AutomaticaContext(Configuration))
            {
                CategoryGroup.GenerateIfNotExists(dbContext, categoryGroupId, "test");

                var categoryGroupCache = ServiceProvider.GetRequiredService <ICategoryGroupCache>();
                categoryGroupCache.Clear();

                dbContext.SaveChanges();
            }

            Assert.NotNull(Controller.GetTemplates().FirstOrDefault(a => a.ObjId == categoryGroupId));
        }
Esempio n. 4
0
        public static List <T> LoadSingle <T>(string file, ILogger logger, AutomaticaContext database, bool isInDevMode)
        {
            var list = new List <T>();

            try
            {
                var fileInfo = new FileInfo(file);
                var folder   = fileInfo.DirectoryName;
                logger.LogDebug($"Loading file {file} and check for interfaces");

                AssemblyLoader loader;
                if (isInDevMode)
                {
                    loader = new AssemblyLoader(folder, new FileInfo(Assembly.GetCallingAssembly().Location).DirectoryName, folder);
                }
                else
                {
                    loader = new AssemblyLoader(folder, folder);
                }

                Func <AssemblyLoadContext, AssemblyName, Assembly> assemblyLoader = (context, name) =>
                {
                    logger.LogDebug($"Try to load assembly {name} for {file}");
                    // avoid loading *.resources dlls, because of: https://github.com/dotnet/coreclr/issues/8416
                    if (name.Name.EndsWith("resources"))
                    {
                        return(null);
                    }

                    logger.LogDebug($"try to load assemably from {folder}");
                    var foundDlls = Directory.GetFileSystemEntries(folder, name.Name + ".dll", SearchOption.AllDirectories);
                    if (foundDlls.Any())
                    {
                        return(context.LoadFromAssemblyPath(foundDlls[0]));
                    }

                    var secondPath = new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName;
                    logger.LogDebug($"try to load assemably from second path: {secondPath}");
                    foundDlls = Directory.GetFileSystemEntries(secondPath, name.Name + ".dll", SearchOption.AllDirectories);
                    if (foundDlls.Any())
                    {
                        return(context.LoadFromAssemblyPath(foundDlls[0]));
                    }

                    var dependencies = DependencyContext.Default.RuntimeLibraries;
                    foreach (var library in dependencies)
                    {
                        if (IsCandidateLibrary(library, name))
                        {
                            return(loader.LoadAssembly(name));
                        }
                    }


                    return(context.LoadFromAssemblyName(name));
                };
                AssemblyLoadContext.Default.Resolving += assemblyLoader;

                Assembly assembly;
                try
                {
                    assembly = Assembly.LoadFrom(file);
                }
                catch (Exception e)
                {
                    logger.LogError(e, $"Could not load assembly");
                    return(list);
                }
                finally
                {
                    AssemblyLoadContext.Default.Resolving -= assemblyLoader;
                }

                var resources = assembly.GetManifestResourceNames().SingleOrDefault(a => a.EndsWith("automatica-manifest.json"));

                if (resources == null)
                {
                    logger.LogWarning($"{file} does not contain a manifest files");
                    throw new NoManifestFoundException();
                }

                var manifest = Common.Update.Plugin.GetEmbeddedPluginManifest(logger, assembly);
                var plugin   = database.Plugins.SingleOrDefault(a => a.PluginGuid == manifest.Automatica.PluginGuid);
                if (plugin == null)
                {
                    plugin = new Plugin
                    {
                        ObjId         = Guid.NewGuid(),
                        Name          = manifest.Automatica.Name,
                        ComponentName = manifest.Automatica.ComponentName,
                        PluginGuid    = manifest.Automatica.PluginGuid,
                        PluginType    = manifest.Automatica.Type == "driver" ? PluginType.Driver : PluginType.Logic,
                        Version       = manifest.Automatica.PluginVersion.ToString(),
                        Loaded        = true
                    };
                    database.Plugins.Add(plugin);
                }
                else
                {
                    plugin.Version = manifest.Automatica.PluginVersion.ToString();
                    plugin.Loaded  = true;
                    database.Plugins.Update(plugin);
                }
                database.SaveChanges();

                foreach (var ti in assembly.ExportedTypes)
                {
                    if (ti.IsSubclassOf(typeof(T)))
                    {
                        if (ti.IsAbstract)
                        {
                            continue;
                        }
                        if (assembly.CreateInstance(ti.FullName) is T factory)
                        {
                            logger.LogDebug($"Found {typeof(T)} in {ti}...");
                            list.Add(factory);
                        }
                    }
                }
            }
            catch (ReflectionTypeLoadException e)
            {
                var builder = new StringBuilder();
                foreach (var ex in e.LoaderExceptions)
                {
                    builder.Append($"{ex}");
                }
                logger.LogError(e.InnerException, $"Could not load {typeof(T)} from {file}...{builder}\n");
            }
            catch (Exception e)
            {
                logger.LogError(e, $"Could not load {typeof(T)}...{e}");
            }
            return(list);
        }
Esempio n. 5
0
        private static void CreateInterfaceTypes(AutomaticaContext context)
        {
            var boards = Enum.GetValues(typeof(BoardTypeEnum));

            foreach (var boardTypeEnum in boards)
            {
                var type       = boardTypeEnum.GetType();
                var memInfo    = type.GetMember(boardTypeEnum.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(GuidTemplateTypeAttribute), false);
                if (attributes.Length > 0 && attributes[0] is GuidTemplateTypeAttribute attribute)
                {
                    var boardType   = context.BoardTypes.SingleOrDefault(a => a.Type == attribute.Guid);
                    var isNewObject = false;
                    if (boardType == null)
                    {
                        boardType      = new BoardType();
                        boardType.Type = attribute.Guid;
                        isNewObject    = true;
                    }

                    boardType.Name        = boardType.ToString();
                    boardType.Description = boardType.ToString();

                    if (isNewObject)
                    {
                        context.BoardTypes.Add(boardType);
                    }
                    else
                    {
                        context.BoardTypes.Update(boardType);
                    }
                }
            }

            var interfaceTypes = Enum.GetValues(typeof(InterfaceTypeEnum));

            foreach (var interfaceTypeEnum in interfaceTypes)
            {
                var type       = interfaceTypeEnum.GetType();
                var memInfo    = type.GetMember(interfaceTypeEnum.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(GuidTemplateTypeAttribute), false);
                if (attributes.Length > 0 && attributes[0] is GuidTemplateTypeAttribute attribute)
                {
                    var interfaceType = context.InterfaceTypes.SingleOrDefault(a => a.Type == attribute.Guid);
                    var isNewObject   = false;
                    if (interfaceType == null)
                    {
                        interfaceType      = new InterfaceType();
                        interfaceType.Type = attribute.Guid;
                        isNewObject        = true;
                    }

                    interfaceType.Name              = interfaceType.ToString();
                    interfaceType.Description       = interfaceType.ToString();
                    interfaceType.IsDriverInterface = false;
                    interfaceType.MaxChilds         = attribute.MaxChilds;
                    interfaceType.MaxInstances      = 1;

                    if (isNewObject)
                    {
                        context.InterfaceTypes.Add(interfaceType);
                    }
                    else
                    {
                        context.InterfaceTypes.Update(interfaceType);
                    }
                }
            }
            context.SaveChanges();
        }
Esempio n. 6
0
        private static void AddBoard(AutomaticaContext context, IDatabaseBoardType boardType)
        {
            var board             = context.BoardTypes.SingleOrDefault(a => a.Type == GuidTemplateTypeAttribute.GetFromEnum(boardType.BoardType));
            var boardNodeTemplate = context.NodeTemplates.SingleOrDefault(a => a.ObjId == board.Type);

            var boardInterfaceType = context.InterfaceTypes.SingleOrDefault(a => a.Type == board.Type);

            if (boardInterfaceType == null)
            {
                boardInterfaceType = new InterfaceType
                {
                    Type                = board.Type,
                    Name                = board.Name,
                    Description         = board.Description,
                    IsDriverInterface   = false,
                    MaxChilds           = int.MaxValue,
                    MaxInstances        = 1,
                    CanProvideBoardType = false
                };

                context.InterfaceTypes.Add(boardInterfaceType);
            }

            if (boardNodeTemplate == null)
            {
                boardNodeTemplate = new NodeTemplate
                {
                    ObjId              = board.Type,
                    DefaultCreated     = false,
                    Description        = board.Description,
                    Name               = board.Name,
                    IsAdapterInterface = false,
                    IsDeleteable       = false,
                    IsReadable         = false,
                    IsReadableFixed    = true,
                    IsWriteable        = false,
                    IsWriteableFixed   = true,
                    Key          = board.Name.Replace(" ", ""),
                    MaxInstances = 1,
                    NeedsInterface2InterfacesType   = board.Type,
                    ProvidesInterface2InterfaceType = board.Type,
                    This2NodeDataType = (int)NodeDataType.NoAttribute,
                    This2DefaultMobileVisuTemplate = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                };

                context.NodeTemplates.Add(boardNodeTemplate);
            }
            context.SaveChanges();


            foreach (var boardInterface in boardType.GetBoardInterfaces())
            {
                var boardInt = context.BoardInterfaces.SingleOrDefault(a => a.ObjId == boardInterface.ObjId);
                if (boardInt == null)
                {
                    context.BoardInterfaces.Add(boardInterface);

                    var nodeTemplate = new NodeTemplate
                    {
                        ObjId              = boardInterface.ObjId,
                        DefaultCreated     = false,
                        Description        = boardInterface.Description,
                        Name               = boardInterface.Name,
                        IsAdapterInterface = false,
                        IsDeleteable       = false,
                        IsReadable         = false,
                        IsReadableFixed    = true,
                        IsWriteable        = false,
                        IsWriteableFixed   = true,
                        Key          = boardInterface.Name.Replace(" ", ""),
                        MaxInstances = 1,
                        NeedsInterface2InterfacesType   = boardNodeTemplate.ObjId,
                        ProvidesInterface2InterfaceType = boardInterface.This2InterfaceType,
                        This2NodeDataType = (int)NodeDataType.NoAttribute,
                        This2DefaultMobileVisuTemplate = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                    };

                    context.NodeTemplates.Add(nodeTemplate);
                }
            }
        }
Esempio n. 7
0
        private static void AddSystemTemplates(AutomaticaContext context)
        {
            var usbIr = new NodeTemplate
            {
                ObjId       = new Guid("4d2cf0d47fe947058271787d5626fbe6"),
                Name        = "COMMON.INTERFACES.USB_IR.NAME",
                Description = "COMMON.INTERFACES.USB_IR.DESCRIPTION",
                Key         = "usbir",
                NeedsInterface2InterfacesType   = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.Usb),
                ProvidesInterface2InterfaceType = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.UsbIr),
                This2DefaultMobileVisuTemplate  = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                IsDeleteable       = true,
                DefaultCreated     = false,
                IsReadable         = false,
                IsReadableFixed    = true,
                IsWriteable        = false,
                IsWriteableFixed   = true,
                MaxInstances       = int.MaxValue,
                This2NodeDataType  = (int)NodeDataType.NoAttribute,
                IsAdapterInterface = true
            };

            if (context.NodeTemplates.SingleOrDefault(a => a.ObjId == usbIr.ObjId) == null)
            {
                context.NodeTemplates.Add(usbIr);
                context.SaveChanges();
            }


            var usbrs485 = new NodeTemplate
            {
                ObjId       = new Guid("acf16ee90377485588341fe1e67d6a93"),
                Name        = "COMMON.INTERFACES.RS485.NAME",
                Description = "COMMON.INTERFACES.RS485.DESCRIPTION",
                Key         = "usbrs485",
                NeedsInterface2InterfacesType   = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.Usb),
                ProvidesInterface2InterfaceType = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.Rs485),
                This2DefaultMobileVisuTemplate  = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                IsDeleteable       = true,
                DefaultCreated     = false,
                IsReadable         = false,
                IsReadableFixed    = true,
                IsWriteable        = false,
                IsWriteableFixed   = true,
                MaxInstances       = int.MaxValue,
                This2NodeDataType  = (int)NodeDataType.NoAttribute,
                IsAdapterInterface = true
            };

            if (context.NodeTemplates.SingleOrDefault(a => a.ObjId == usbrs485.ObjId) == null)
            {
                context.NodeTemplates.Add(usbrs485);
                context.SaveChanges();
            }

            var usbrs232 = new NodeTemplate
            {
                ObjId       = new Guid("09d3b6b4391847e091aa5a540a7bd67f"),
                Name        = "COMMON.INTERFACES.RS232.NAME",
                Description = "COMMON.INTERFACES.RS232.DESCRIPTION",
                Key         = "usbrs232",
                NeedsInterface2InterfacesType   = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.Usb),
                ProvidesInterface2InterfaceType = GuidTemplateTypeAttribute.GetFromEnum(InterfaceTypeEnum.Rs232), This2DefaultMobileVisuTemplate = VisuMobileObjectTemplateTypeAttribute.GetFromEnum(VisuMobileObjectTemplateTypes.Label),
                IsDeleteable       = true,
                DefaultCreated     = false,
                IsReadable         = false,
                IsReadableFixed    = true,
                IsWriteable        = false,
                IsWriteableFixed   = true,
                MaxInstances       = int.MaxValue,
                This2NodeDataType  = (int)NodeDataType.NoAttribute,
                IsAdapterInterface = true
            };

            if (context.NodeTemplates.SingleOrDefault(a => a.ObjId == usbrs232.ObjId) == null)
            {
                context.NodeTemplates.Add(usbrs232);
                context.SaveChanges();
            }
        }
Esempio n. 8
0
        private static void AddAreaData(AutomaticaContext context)
        {
            var areaTypes = Enum.GetValues(typeof(AreaTypes));

            foreach (var areaType in areaTypes)
            {
                var type       = areaType.GetType();
                var memInfo    = type.GetMember(areaType.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(AreaTypeAttribute), false);

                if (attributes.Length == 0)
                {
                    continue;
                }

                if (attributes[0] is AreaTypeAttribute attribute)
                {
                    var areaTypeDb = context.AreaTypes.SingleOrDefault(a => a.ObjId == attribute.ObjId);
                    var isNew      = false;
                    if (areaTypeDb == null)
                    {
                        areaTypeDb       = new AreaType();
                        areaTypeDb.ObjId = attribute.ObjId;

                        isNew = true;
                    }

                    areaTypeDb.Name        = attribute.Name;
                    areaTypeDb.Description = attribute.Description;

                    if (isNew)
                    {
                        context.AreaTypes.Add(areaTypeDb);
                    }
                    else
                    {
                        context.AreaTypes.Update(areaTypeDb);
                    }
                }
            }

            context.SaveChanges();

            var areaTemplates = Enum.GetValues(typeof(AreaTemplates));

            foreach (var areaTemplate in areaTemplates)
            {
                var type       = areaTemplate.GetType();
                var memInfo    = type.GetMember(areaTemplate.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(AreaTemplateAttribute), false);

                if (attributes.Length == 0)
                {
                    continue;
                }

                if (attributes[0] is AreaTemplateAttribute attribute)
                {
                    var areaTemplateDb = context.AreaTemplates.SingleOrDefault(a => a.ObjId == attribute.ObjId);
                    var isNew          = false;
                    if (areaTemplateDb == null)
                    {
                        areaTemplateDb       = new AreaTemplate();
                        areaTemplateDb.ObjId = attribute.ObjId;

                        isNew = true;
                    }

                    areaTemplateDb.Name                   = attribute.Name;
                    areaTemplateDb.Description            = attribute.Description;
                    areaTemplateDb.This2AreaType          = AreaTypeAttribute.GetFromEnum(attribute.IsAreaType);
                    areaTemplateDb.NeedsThis2AreaType     = AreaTypeAttribute.GetFromEnum(attribute.NeedsAreaType);
                    areaTemplateDb.ProvidesThis2AreayType = AreaTypeAttribute.GetFromEnum(attribute.ProvidesAreayType);
                    areaTemplateDb.Icon                   = attribute.Icon;
                    areaTemplateDb.IsDeleteable           = attribute.IsDeletable;

                    if (isNew)
                    {
                        context.AreaTemplates.Add(areaTemplateDb);
                    }
                    else
                    {
                        context.AreaTemplates.Update(areaTemplateDb);
                    }

                    context.SaveChanges();
                }
            }
        }
Esempio n. 9
0
        private static void AddInitUserManagementData(AutomaticaContext context)
        {
            var salt   = UserHelper.GenerateNewSalt();
            var saUser = new User
            {
                UserName  = "******",
                FirstName = "admin",
                LastName  = "admin",
                Salt      = salt,
                Password  = UserHelper.HashPassword("sa", salt),
                ObjId     = Guid.NewGuid()
            };

            context.Add(saUser);


            var adminGroup = new UserGroup
            {
                ObjId = Guid.NewGuid(),
                Name  = "Admin"
            };

            context.Add(adminGroup);


            var adminRole = new Role
            {
                ObjId       = Guid.NewGuid(),
                Name        = "ROLES.ADMINISTRATOR.NAME",
                Description = "ROLES.ADMINISTRATOR.DESCRIPTION",
                Key         = Role.AdminRole
            };

            context.Add(adminRole);

            var priviliedge = new Priviledge
            {
                ObjId       = Guid.NewGuid(),
                Name        = "PRIVILEDGE.ALL.NAME",
                Description = "PRIVILEDGE.ALL.DESCRIPTION",
                Key         = "superuser"
            };

            context.Add(priviliedge);


            context.Add(new Priviledge2Role
            {
                This2Priviledge = priviliedge.ObjId,
                This2Role       = adminRole.ObjId
            });

            context.Add(new User2Group
            {
                This2User      = saUser.ObjId,
                This2UserGroup = adminGroup.ObjId
            });

            context.Add(new User2Role
            {
                This2User = saUser.ObjId,
                This2Role = adminRole.ObjId
            });


            salt = UserHelper.GenerateNewSalt();
            var visuUser = new User
            {
                UserName  = "******",
                FirstName = "Visu",
                LastName  = "Visu",
                Salt      = salt,
                Password  = UserHelper.HashPassword("visu", salt),
                ObjId     = Guid.NewGuid()
            };

            context.Add(visuUser);

            var visuGroup = new UserGroup
            {
                ObjId = Guid.NewGuid(),
                Name  = "Visu"
            };

            context.Add(visuGroup);

            context.Add(new User2Group
            {
                This2User      = visuUser.ObjId,
                This2UserGroup = visuGroup.ObjId
            });


            var visuRole = new Role
            {
                ObjId       = Guid.NewGuid(),
                Name        = "ROLES.VISUALISATION.NAME",
                Description = "ROLES.VISUALISATION.DESCRIPTION",
                Key         = Role.VisuRole
            };

            context.Add(visuRole);

            var visuPriviliedge = new Priviledge
            {
                ObjId       = Guid.NewGuid(),
                Name        = "PRIVILEDGE.VISU.NAME",
                Description = "PRIVILEDGE.VISU.DESCRIPTION",
                Key         = "visu"
            };

            context.Add(visuPriviliedge);


            context.Add(new Priviledge2Role
            {
                This2Priviledge = visuPriviliedge.ObjId,
                This2Role       = visuRole.ObjId
            });

            context.Add(new User2Role
            {
                This2User = visuUser.ObjId,
                This2Role = visuRole.ObjId
            });


            context.Add(new UserGroup2Role()
            {
                This2UserGroup = visuGroup.ObjId,
                This2Role      = visuRole.ObjId
            });


            context.SaveChanges();
        }
Esempio n. 10
0
        public Task Load(IDriverFactory factory, IBoardType boardType)
        {
            try
            {
                var manifest = Common.Update.Plugin.GetEmbeddedPluginManifest(_logger, factory.GetType().Assembly);

                if (manifest == null)
                {
                    throw new NoManifestFoundException();
                }

                _store.Add(manifest.Automatica.PluginGuid, manifest);

                _driverFactoryStore.Add(factory.DriverGuid, factory);
                _logger.LogDebug($"Init driver {factory.DriverName} {factory.DriverVersion}...");

                var driverDbVersion =
                    _dbContext.VersionInformations.SingleOrDefault(a => a.DriverGuid == factory.DriverGuid);
                var initNodeTemplates = false;

                if (driverDbVersion == null)
                {
                    driverDbVersion = new VersionInformation
                    {
                        Name       = factory.DriverName,
                        Version    = factory.DriverVersion.ToString(),
                        DriverGuid = factory.DriverGuid
                    };
                    initNodeTemplates = true;
                    _dbContext.VersionInformations.Add(driverDbVersion);
                }
                else if (factory.DriverVersion > driverDbVersion.VersionData)
                {
                    initNodeTemplates       = true;
                    driverDbVersion.Name    = factory.DriverName;
                    driverDbVersion.Version = factory.DriverVersion.ToString();
                }

                if (!UsesInterface(boardType, factory))
                {
                    _logger.LogInformation(
                        $"Ignore {factory.DriverName} because we do not support any of the given interfaces");
                    return(Task.CompletedTask);
                }

                _localizationProvider.LoadFromAssembly(factory.GetType().Assembly);
                if (initNodeTemplates || factory.InDevelopmentMode)
                {
                    _logger.LogDebug($"InitNodeTemplates for {factory.DriverName}...");
                    using (var db = new AutomaticaContext(_config))
                    {
                        factory.InitNodeTemplates(new NodeTemplateFactory(db, _config));
                        db.SaveChanges();
                    }

                    _logger.LogDebug($"InitNodeTemplates for {factory.DriverName}...done");
                }
                else
                {
                    factory.InitNodeTemplates(new DoNothingNodeTemplateFactory());
                }

                _logger.LogDebug($"Init driver {factory.DriverName} {factory.DriverVersion}...done");

                _dbContext.SaveChanges();
            }
            catch (NoManifestFoundException)
            {
                // ignore
            }
            catch (Exception e)
            {
                _logger.LogError($"Could not load driver {factory.DriverName} {e}", e);
            }

            return(Task.CompletedTask);
        }