示例#1
0
        /// <summary>
        /// Update the ModuleVersion of the bumped module in any dependent module's RequiredModule field.
        /// </summary>
        private void UpdateDependentModules()
        {
            var moduleName         = _fileHelper.ModuleName;
            var projectDirectories = _fileHelper.ProjectDirectories;

            foreach (var projectDirectory in projectDirectories)
            {
                var moduleManifestPaths = Directory.GetFiles(projectDirectory, "*.psd1", SearchOption.AllDirectories)
                                          .Where(f => !f.Contains("Netcore") &&
                                                 !f.Contains("bin") &&
                                                 !f.Contains("dll-Help") &&
                                                 !ModuleFilter.IsAzureStackModule(f))
                                          .ToList();
                foreach (var moduleManifestPath in moduleManifestPaths)
                {
                    var file    = File.ReadAllLines(moduleManifestPath);
                    var pattern = @"ModuleName(\s*)=(\s*)(['\""])" + moduleName + @"(['\""])(\s*);(\s*)ModuleVersion(\s*)=(\s*)(['\""])" + "\\d+(\\.\\d+)+" + @"(['\""])";
                    if (file.Where(l => Regex.IsMatch(l, pattern)).Any())
                    {
                        var updatedFile = file.Select(l => Regex.Replace(l, pattern, "ModuleName = '" + moduleName + "'; ModuleVersion = '" + _newVersion + "'"));
                        File.WriteAllLines(moduleManifestPath, updatedFile);
                    }
                }
            }
        }
示例#2
0
        public PagedResult <ModuleEntity> GetModules(ModuleFilter filter, int pageSize, int pageNo)
        {
            try
            {
                var filteredQuery = GetFilteredQuery(filter, false);
                var countQuery    = GetFilteredQuery(filter, false);

                var cResult = new PagedResult <ModuleEntity>();

                cResult.Total      = countQuery.Count();
                cResult.TotalPages = cResult.Total / pageSize;
                if (cResult.Total % pageSize > 0)
                {
                    cResult.TotalPages++;
                }
                cResult.LastPageNo = pageNo;
                cResult.ResultData = new List <ModuleEntity>();
                if (pageNo <= cResult.TotalPages)
                {
                    cResult.ResultData.AddRange(filteredQuery.Skip(pageSize * (pageNo - 1)).Take(pageSize).ToList());
                }
                return(cResult);
            }
            catch (Exception exc)
            {
                Logging.Logger.Log(exc);
                throw new Exception("Error fetching modules.", exc);
            }
        }
示例#3
0
        public void Add <T>(T instance, string name, ModuleFilter filter)
            where T : class, IModule
        {
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }
            if (Client == null)
            {
                throw new InvalidOperationException("Service needs to be added to a DiscordClient before modules can be installed.");
            }

            Type type = typeof(T);

            if (name == null)
            {
                name = type.Name;
            }
            if (_modules.ContainsKey(type))
            {
                throw new InvalidOperationException("This module has already been added.");
            }

            var manager = new ModuleManager <T>(Client, instance, name, filter);

            _modules.Add(type, manager);
            instance.Install(manager);
        }
示例#4
0
        private async Task <bool> CanChangeModuleStateInServer(ModuleManager module, ModuleFilter checkFilter,
                                                               CommandEventArgs evnt, bool prviateCheck = true)
        {
            if (!module.FilterType.HasFlag(checkFilter))
            {
                await
                evnt.Channel.SafeSendMessage($"This module doesn't support being enabled. (no `{checkFilter}` flag)");

                return(false);
            }

            if (evnt.Channel.IsPrivate)
            {
                await evnt.Channel.SafeSendMessage("Moduel state changing is not allowed in private channels.");

                return(false);
            }

            if (prviateCheck && PrivateModules.FirstOrDefault(m => m.ToLowerInvariant() == module.Id) != null &&
                evnt.User.Id != Constants.UserOwner)
            {
                await
                evnt.Channel.SafeSendMessage("This module is private. Use }contact for more information.");

                return(false);
            }
            return(true);
        }
示例#5
0
        public T Add <T>(T module, string name, ModuleFilter type)
            where T : class, IModule
        {
            if (module == null)
            {
                throw new ArgumentNullException(nameof(module));
            }
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (Client == null)
            {
                throw new InvalidOperationException("Service needs to be added to a DiscordClient before modules can be installed.");
            }
            if (_modules.ContainsKey(module))
            {
                throw new InvalidOperationException("This module has already been added.");
            }

            var manager = new ModuleManager(Client, module, name, type);

            _modules.Add(module, manager);
            module.Install(manager);
            return(module);
        }
示例#6
0
 public FilterInformation()
 {
     Sort   = string.Empty;
     Area   = new AreaFilter();
     Module = new ModuleFilter();
     Action = new ActionFilter();
     User   = new UserFilter();
 }
示例#7
0
 public Filter(DateFilter dateFilter, ModuleFilter moduleFilter, WeekFilter weekFilter,
               bool sessionFilter, WeekType firstWeekType)
 {
     this.DateFilter    = dateFilter;
     this.ModuleFilter  = moduleFilter;
     this.WeekFilter    = weekFilter;
     this.SessionFilter = sessionFilter;
     this.FirstWeekType = firstWeekType;
 }
        private void btnLoadLibraries_Click(object sender, RoutedEventArgs e)
        {
            var moduleFilter = new ModuleFilter()
            {
                allowedModuleNames = AppState.assemblyLoader.dllNames.Split(','),
            };
            var dllNames = AssemblyLoader.filterAssemblies(moduleFilter);

            AssemblyLoader.loadAssemblies(dllNames);
        }
示例#9
0
        /// <summary>
        /// Apply before and after filter methods
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private Func <RequestExecutionContext, IRequestFilter> ApplyFilter(IEndPointMethodConfigurationReadOnly arg)
        {
            if (BeforeExecute != null || AfterExecute != null)
            {
                var filter = new ModuleFilter(BeforeExecute, AfterExecute);

                return(context => filter);
            }

            return(null);
        }
示例#10
0
		internal ModuleManager(DiscordClient client, IModule instance, string name, ModuleFilter filterType)
		{
            Client = client;
            Instance = instance;
            Name = name;
            FilterType = filterType;

            Id = name.ToLowerInvariant();
            _lock = new AsyncLock();

			_allowAll = filterType == ModuleFilter.None;
			_useServerWhitelist = filterType.HasFlag(ModuleFilter.ServerWhitelist);
			_useChannelWhitelist = filterType.HasFlag(ModuleFilter.ChannelWhitelist);
			_allowPrivate = filterType.HasFlag(ModuleFilter.AlwaysAllowPrivate);

            _enabledServers = new ConcurrentDictionary<ulong, Server>();
			_enabledChannels = new ConcurrentDictionary<ulong, Channel>();
			_indirectServers = new ConcurrentDictionary<ulong, int>();

			if (_allowAll || _useServerWhitelist) //Server-only events
			{
				client.ChannelCreated += (s, e) => { if (e.Server != null && HasServer(e.Server)) ChannelCreated(s, e); };
				client.UserVoiceStateUpdated += (s, e) => { if (HasServer(e.Server)) UserVoiceStateUpdated(s, e); };
			}

			client.ChannelDestroyed += (s, e) => { if (HasChannel(e.Channel)) ChannelDestroyed(s, e); };
			client.ChannelUpdated += (s, e) => { if (HasChannel(e.Channel)) ChannelUpdated(s, e); };

			client.MessageReceived += (s, e) => { if (HasChannel(e.Channel)) MessageReceived(s, e); };
			client.MessageSent += (s, e) => { if (HasChannel(e.Channel)) MessageSent(s, e); };
			client.MessageDeleted += (s, e) => { if (HasChannel(e.Channel)) MessageDeleted(s, e); };
			client.MessageUpdated += (s, e) => { if (HasChannel(e.Channel)) MessageUpdated(s, e); };
			client.MessageAcknowledged += (s, e) => { if (HasChannel(e.Channel)) MessageReadRemotely(s, e); };

			client.RoleCreated += (s, e) => { if (HasIndirectServer(e.Server)) RoleCreated(s, e); };
			client.RoleUpdated += (s, e) => { if (HasIndirectServer(e.Server)) RoleUpdated(s, e); };
			client.RoleDeleted += (s, e) => { if (HasIndirectServer(e.Server)) RoleDeleted(s, e); };

			client.LeftServer += (s, e) => { if (HasIndirectServer(e.Server)) { DisableServer(e.Server); LeftServer(s, e); } };
			client.ServerUpdated += (s, e) => { if (HasIndirectServer(e.Server)) ServerUpdated(s, e); };
			client.ServerUnavailable += (s, e) => { if (HasIndirectServer(e.Server)) ServerUnavailable(s, e); };
			client.ServerAvailable += (s, e) => { if (HasIndirectServer(e.Server)) ServerAvailable(s, e); };

			client.UserJoined += (s, e) => { if (HasIndirectServer(e.Server)) UserJoined(s, e); };
			client.UserLeft += (s, e) => { if (HasIndirectServer(e.Server)) UserLeft(s, e); };
			client.UserUpdated += (s, e) => { if (HasIndirectServer(e.Server)) UserUpdated(s, e); };
			client.UserIsTypingUpdated += (s, e) => { if (HasChannel(e.Channel)) UserIsTypingUpdated(s, e); };
			//TODO: We aren't getting events from UserPresence if AllowPrivate is enabled, but the server we know that user through isn't on the whitelist
			client.UserPresenceUpdated += (s, e) => { if (HasIndirectServer(e.Server)) UserPresenceUpdated(s, e); };
			client.UserBanned += (s, e) => { if (HasIndirectServer(e.Server)) UserBanned(s, e); };
			client.UserUnbanned += (s, e) => { if (HasIndirectServer(e.Server)) UserUnbanned(s, e); };
		}
示例#11
0
        /// <summary>
        /// Возвращает постраничный список модулей с компонентами
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public Paged<ModuleModel> GetModules(ModuleFilter filter)
        {
            using (var db = new CMSdb(_context))
            {
                var query = db.core_controllers
                     .Where(t => t.id != Guid.Empty)
                     .Where(t => t.f_parent == null);

                if (!string.IsNullOrEmpty(filter.SearchText))
                    query = query.Where(t => t.c_name.ToLower().Contains(filter.SearchText) || t.c_desc.ToLower().Contains(filter.SearchText));

                query = query.OrderBy(t => t.n_sort);

                int itemsCount = query.Count();

                var list = query
                    .Skip(filter.Size * (filter.Page - 1))
                    .Take(filter.Size).Select(s => new ModuleModel()
                    {
                        Id = s.id,
                        Name = s.c_name,
                        ControllerName = s.c_controller_name,
                        ModuleParts = db.core_controllers
                                        .Where(m => m.f_parent == s.id)
                                        .Select(m => new ModuleModel()
                                        {
                                            Id = m.id,
                                            InAdmin = m.b_be,
                                            Name = m.c_name,
                                            ControllerName = m.c_controller_name,
                                            ActionName = m.c_action_name,
                                            ParentId = m.f_parent,
                                            Desc = m.c_desc,
                                            View = m.c_default_view
                                        }).ToArray()
                    });

                return new Paged<ModuleModel>()
                {
                    Items = list.ToArray(),
                    Pager = new PagerModel()
                    {
                        PageNum = filter.Page,
                        PageSize = filter.Size,
                        TotalCount = itemsCount
                    }
                };
            }
        }
示例#12
0
 public IEnumerable <ModulePoint> GetModulePointHistory(ModuleFilter filter)
 {
     try
     {
         var filteredQuery = this.GetFilteredEventQuery(filter);
         return(filteredQuery.Select(m => new ModulePoint {
             Id = m.Module.Id, SerialNumber = m.Module.Name, Latitude = m.Latitude, Longitude = m.Longitude, ModuleEvent = ModuleEventType.IMPORTED_FROM_FILE, ModuleStatus = m.ModuleStatus
         }).ToList());
     }
     catch (Exception exc)
     {
         Logging.Logger.Log(exc);
         throw new Exception("Error fetching modules.", exc);
     }
 }
示例#13
0
        public void CanonModuleFilter()
        {
            var canon = new FilterCanonicalizer();

            var moduleFilter1 = new ModuleFilter(ModuleName("A"));
            var moduleFilter2 = new ModuleFilter(ModuleName("A"));
            var moduleFilter3 = new ModuleFilter(ModuleName("B"));

            var canonModuleFilter1 = moduleFilter1.Canonicalize(canon);
            var canonModuleFilter2 = moduleFilter2.Canonicalize(canon);
            var canonModuleFilter3 = moduleFilter3.Canonicalize(canon);

            Assert.Same(canonModuleFilter1, canonModuleFilter2);
            Assert.NotSame(canonModuleFilter1, canonModuleFilter3);
        }
示例#14
0
        /// <summary>
        /// Update the ModuleVersion of the bumped module in any dependent module's RequiredModule field.
        /// </summary>
        private void UpdateDependentModules()
        {
            var moduleName         = _fileHelper.ModuleName;
            var projectDirectories = _fileHelper.ProjectDirectories;
            var outputDirectories  = _fileHelper.OutputDirectories;

            foreach (var projectDirectory in projectDirectories)
            {
                var moduleManifestPaths = Directory.GetFiles(projectDirectory, "*.psd1", SearchOption.AllDirectories)
                                          .Where(f => !f.Contains("Netcore") &&
                                                 !f.Contains("bin") &&
                                                 !f.Contains("dll-Help") &&
                                                 !ModuleFilter.IsAzureStackModule(f))
                                          .ToList();
                foreach (var moduleManifestPath in moduleManifestPaths)
                {
                    var file    = File.ReadAllLines(moduleManifestPath);
                    var pattern = @"ModuleName(\s*)=(\s*)(['\""])" + moduleName + @"(['\""])(\s*);(\s*)ModuleVersion(\s*)=(\s*)(['\""])" + _oldVersion + @"(['\""])";
                    if (file.Where(l => Regex.IsMatch(l, pattern)).Any())
                    {
                        var updatedFile = file.Select(l => Regex.Replace(l, pattern, "ModuleName = '" + moduleName + "'; ModuleVersion = '" + _newVersion + "'"));
                        File.WriteAllLines(moduleManifestPath, updatedFile);
                        var updatedModuleName = Path.GetFileNameWithoutExtension(moduleManifestPath);
                        foreach (var outputDirectory in outputDirectories)
                        {
                            var outputModuleDirectory = Directory.GetDirectories(outputDirectory, updatedModuleName).FirstOrDefault();
                            if (outputModuleDirectory == null)
                            {
                                continue;
                            }

                            var outputModuleManifestPath = Directory.GetFiles(outputModuleDirectory, updatedModuleName + ".psd1").FirstOrDefault();
                            if (outputModuleManifestPath == null)
                            {
                                continue;
                            }

                            File.WriteAllLines(outputModuleManifestPath, updatedFile);
                        }
                    }
                }
            }
        }
示例#15
0
        /// <summary>
        /// Validate version bump of changed modules or a specified module.
        /// </summary>
        private static void ValidateVersionBump()
        {
            var changedModules = new List <string>();

            foreach (var directory in _projectDirectories)
            {
                var changeLogs = Directory.GetFiles(directory, "ChangeLog.md", SearchOption.AllDirectories)
                                 .Where(f => !ModuleFilter.IsAzureStackModule(f))
                                 .Select(f => GetModuleManifestPath(Directory.GetParent(f).FullName))
                                 .Where(m => !string.IsNullOrEmpty(m) && m.Contains(_moduleNameFilter))
                                 .ToList();
                changedModules.AddRange(changeLogs);
            }

            foreach (var projectModuleManifestPath in changedModules)
            {
                var moduleFileName = Path.GetFileName(projectModuleManifestPath);
                var moduleName     = moduleFileName.Replace(".psd1", "");

                var outputModuleManifest = _outputDirectories
                                           .SelectMany(d => Directory.GetDirectories(d, moduleName))
                                           .SelectMany(d => Directory.GetFiles(d, moduleFileName))
                                           .ToList();
                if (outputModuleManifest.Count == 0)
                {
                    throw new FileNotFoundException("No module manifest file found in output directories");
                }
                else if (outputModuleManifest.Count > 1)
                {
                    throw new IndexOutOfRangeException("Multiple module manifest files found in output directories");
                }

                var outputModuleManifestFile = outputModuleManifest.FirstOrDefault();

                var validatorFileHelper = new VersionFileHelper(_rootDirectory, outputModuleManifestFile, projectModuleManifestPath);

                _versionValidator = new VersionValidator(validatorFileHelper);

                _versionValidator.ValidateAllVersionBumps();
            }
        }
示例#16
0
文件: Prune.cs 项目: nsacyber/PRUNE
            //Collects all modules for the process argument and returns them in a list
            public static List <Module> CollectModules(Process process)
            {
                ModuleFilter filter = (Is64Bit(process) && Environment.Is64BitProcess)
                    ? ModuleFilter.ListModulesAll
                    : ModuleFilter.ListModules32Bit;

                List <Module> collectedModules = new List <Module>();

                IntPtr[] modulePointers = new IntPtr[0];

                if (!EnumProcessModulesEx(process.Handle, modulePointers, 0, out int bytesNeeded,
                                          (uint)filter))
                {
                    return(collectedModules);
                }

                int totalNumberOfModules = bytesNeeded / IntPtr.Size;

                modulePointers = new IntPtr[totalNumberOfModules];

                if (EnumProcessModulesEx(process.Handle, modulePointers, bytesNeeded, out bytesNeeded,
                                         (uint)filter))
                {
                    for (int index = 0; index < totalNumberOfModules; index++)
                    {
                        StringBuilder moduleFilePath = new StringBuilder(1024);
                        GetModuleFileNameEx(process.Handle, modulePointers[index], moduleFilePath,
                                            (uint)(moduleFilePath.Capacity));

                        string moduleName = Path.GetFileName(moduleFilePath.ToString());
                        GetModuleInformation(process.Handle, modulePointers[index], out ModuleInformation moduleInformation,
                                             (uint)(IntPtr.Size * (modulePointers.Length)));

                        Module module = new Module(moduleName, moduleInformation.lpBaseOfDll, moduleInformation.SizeOfImage);
                        collectedModules.Add(module);
                    }
                }

                return(collectedModules);
            }
示例#17
0
 public static void AddModule(this DiscordClient client, IModule instance, string name = null, ModuleFilter filter = ModuleFilter.None)
 {
     client.GetService <ModuleService>().Add(instance, name, filter);
 }
示例#18
0
        /// <summary>
        /// Given a set of directory paths containing PowerShell module folders,
        /// analyze the breaking changes in the modules and report any issues
        ///
        /// Filters can be added to find breaking changes for specific modules
        /// </summary>
        /// <param name="cmdletProbingDirs">Set of directory paths containing PowerShell module folders to be checked for breaking changes.</param>
        /// <param name="directoryFilter">Function that filters the directory paths to be checked.</param>
        /// <param name="cmdletFilter">Function that filters the cmdlets to be checked.</param>
        /// <param name="modulesToAnalyze">The set of modules to analyze</param>
        public void Analyze(IEnumerable <string> cmdletProbingDirs, Func <IEnumerable <string>, IEnumerable <string> > directoryFilter, Func <string, bool> cmdletFilter, IEnumerable <string> modulesToAnalyze)
        {
            if (directoryFilter != null)
            {
                cmdletProbingDirs = directoryFilter(cmdletProbingDirs);
            }

            var logFileName = Path.Combine(OutputFilePath, BreakingChangeAttributeReportLoggerName);
            //Init the log file
            var logger = TextFileLogger.GetTextFileLogger(logFileName, CleanBreakingChangesFileBeforeWriting);

            try
            {
                foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") &&
                                                                      !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s))))
                {
                    var probingDirectories = new List <string> {
                        baseDirectory
                    };

                    // Add current directory for probing
                    probingDirectories.AddRange(Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory)));


                    foreach (var directory in probingDirectories)
                    {
                        if (modulesToAnalyze != null &&
                            modulesToAnalyze.Any() &&
                            !modulesToAnalyze.Any(m => directory.EndsWith(m)))
                        {
                            continue;
                        }

                        var cmdlets = GetCmdletsFilesInFolder(directory);
                        if (!cmdlets.Any())
                        {
                            continue;
                        }

                        foreach (var cmdletFileName in cmdlets)
                        {
                            var cmdletFileFullPath = Path.Combine(directory, Path.GetFileName(cmdletFileName));

                            if (!File.Exists(cmdletFileFullPath))
                            {
                                continue;
                            }

// TODO: Remove IfDef
#if NETSTANDARD
                            var proxy = new CmdletBreakingChangeAttributeLoader();
#else
                            var proxy = EnvironmentHelpers.CreateProxy <CmdletBreakingChangeAttributeLoader>(directory, out _appDomain);
#endif
                            var cmdletDataForModule = proxy.GetModuleBreakingChangeAttributes(cmdletFileFullPath);

                            //If there is nothing in this module just continue
                            if (cmdletDataForModule == null)
                            {
                                Console.WriteLine("No breaking change attributes found in module " + cmdletFileName);
                                continue;
                            }

                            if (cmdletFilter != null)
                            {
                                var output = string.Format("Before filter\nmodule cmdlet count: {0}\n",
                                                           cmdletDataForModule.CmdletList.Count);

                                output += string.Format("\nCmdlet file: {0}", cmdletFileFullPath);

                                cmdletDataForModule.FilterCmdlets(cmdletFilter);

                                output += string.Format("After filter\nmodule cmdlet count: {0}\n",
                                                        cmdletDataForModule.CmdletList.Count);

                                foreach (var cmdlet in cmdletDataForModule.CmdletList)
                                {
                                    output += string.Format("\n\tcmdlet - {0}", cmdlet.CmdletName);
                                }

                                Console.WriteLine(output);
                            }

                            LogBreakingChangesInModule(cmdletDataForModule, logger);
// TODO: Remove IfDef code
#if !NETSTANDARD
                            AppDomain.Unload(_appDomain);
#endif
                        }
                    }
                }
            }
            finally
            {
                if (logger != null)
                {
                    TextFileLogger.CloseLogger(logFileName);
                }
            }
        }
示例#19
0
        public IEnumerable <ModuleEntity> GetAllMatchingModules(ModuleFilter filter)
        {
            try
            {
                var orderable = GetFilteredQuery(filter, true);
                if (filter.Sort2Ascending)
                {
                    if (filter.SortCol2.ToLower() == "client")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Farm.Client.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "farm")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Farm.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "field")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "serial no")
                    {
                        orderable = orderable.ThenBy(m => m.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "load #")
                    {
                        orderable = orderable.ThenBy(m => m.LoadNumber);
                    }
                    else if (filter.SortCol2.ToLower() == "truck id")
                    {
                        orderable = orderable.ThenBy(m => m.TruckID);
                    }
                    else if (filter.SortCol2.ToLower() == "driver")
                    {
                        orderable = orderable.ThenBy(m => m.Driver);
                    }
                    else if (filter.SortCol2.ToLower() == "status")
                    {
                        orderable = orderable.ThenBy(m => m.ModuleStatus);
                    }
                    else if (filter.SortCol2.ToLower() == "timestamp")
                    {
                        orderable = orderable.ThenBy(m => m.Created);
                    }
                    else if (filter.SortCol2.ToLower() == "created")
                    {
                        orderable = orderable.ThenBy(m => m.Created);
                    }
                    else if (filter.SortCol2.ToLower() == "updated")
                    {
                        orderable = orderable.ThenBy(m => m.Updated);
                    }
                }
                else
                {
                    if (filter.SortCol2.ToLower() == "client")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Farm.Client.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "farm")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Farm.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "field")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "serial no")
                    {
                        orderable = orderable.ThenByDescending(m => m.Name);
                    }
                    else if (filter.SortCol2.ToLower() == "load #")
                    {
                        orderable = orderable.ThenByDescending(m => m.LoadNumber);
                    }
                    else if (filter.SortCol2.ToLower() == "truck id")
                    {
                        orderable = orderable.ThenByDescending(m => m.TruckID);
                    }
                    else if (filter.SortCol2.ToLower() == "driver")
                    {
                        orderable = orderable.ThenByDescending(m => m.Driver);
                    }
                    else if (filter.SortCol2.ToLower() == "status")
                    {
                        orderable = orderable.ThenByDescending(m => m.ModuleStatus);
                    }
                    else if (filter.SortCol2.ToLower() == "timestamp")
                    {
                        orderable = orderable.ThenByDescending(m => m.Created);
                    }
                    else if (filter.SortCol2.ToLower() == "created")
                    {
                        orderable = orderable.ThenByDescending(m => m.Created);
                    }
                    else if (filter.SortCol2.ToLower() == "updated")
                    {
                        orderable = orderable.ThenByDescending(m => m.Updated);
                    }
                }

                if (filter.Sort3Ascending)
                {
                    if (filter.SortCol3.ToLower() == "client")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Farm.Client.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "farm")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Farm.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "field")
                    {
                        orderable = orderable.ThenBy(m => m.Field.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "serial no")
                    {
                        orderable = orderable.ThenBy(m => m.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "load #")
                    {
                        orderable = orderable.ThenBy(m => m.LoadNumber);
                    }
                    else if (filter.SortCol3.ToLower() == "truck id")
                    {
                        orderable = orderable.ThenBy(m => m.TruckID);
                    }
                    else if (filter.SortCol3.ToLower() == "driver")
                    {
                        orderable = orderable.ThenBy(m => m.Driver);
                    }
                    else if (filter.SortCol3.ToLower() == "status")
                    {
                        orderable = orderable.ThenBy(m => m.ModuleStatus);
                    }
                    else if (filter.SortCol3.ToLower() == "timestamp")
                    {
                        orderable = orderable.ThenBy(m => m.Created);
                    }
                    else if (filter.SortCol3.ToLower() == "created")
                    {
                        orderable = orderable.ThenBy(m => m.Created);
                    }
                    else if (filter.SortCol3.ToLower() == "updated")
                    {
                        orderable = orderable.ThenBy(m => m.Updated);
                    }
                }
                else
                {
                    if (filter.SortCol3.ToLower() == "client")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Farm.Client.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "farm")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Farm.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "field")
                    {
                        orderable = orderable.ThenByDescending(m => m.Field.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "serial no")
                    {
                        orderable = orderable.ThenByDescending(m => m.Name);
                    }
                    else if (filter.SortCol3.ToLower() == "load #")
                    {
                        orderable = orderable.ThenByDescending(m => m.LoadNumber);
                    }
                    else if (filter.SortCol3.ToLower() == "truck id")
                    {
                        orderable = orderable.ThenByDescending(m => m.TruckID);
                    }
                    else if (filter.SortCol3.ToLower() == "driver")
                    {
                        orderable = orderable.ThenByDescending(m => m.Driver);
                    }
                    else if (filter.SortCol3.ToLower() == "status")
                    {
                        orderable = orderable.ThenByDescending(m => m.ModuleStatus);
                    }
                    else if (filter.SortCol3.ToLower() == "timestamp")
                    {
                        orderable = orderable.ThenByDescending(m => m.Created);
                    }
                    else if (filter.SortCol3.ToLower() == "created")
                    {
                        orderable = orderable.ThenByDescending(m => m.Created);
                    }
                    else if (filter.SortCol3.ToLower() == "updated")
                    {
                        orderable = orderable.ThenByDescending(m => m.Updated);
                    }
                }

                return(orderable.ToList());
            }
            catch (Exception exc)
            {
                Logging.Logger.Log(exc);
                throw new Exception("Error fetching modules.", exc);
            }
        }
示例#20
0
 public IEnumerable <ModuleHistoryEntity> GetAllMatchingLocations(ModuleFilter filter)
 {
     return(this.GetFilteredEventQuery(filter).ToList());
 }
示例#21
0
        private IQueryable <ModuleHistoryEntity> GetFilteredEventQuery(ModuleFilter filter)
        {
            string farmName   = filter.Farm.Trim();
            string clientName = filter.Client.Trim();
            string fieldName  = filter.Field.Trim();

            DateTime?start = null;

            if (filter.StartDate.HasValue)
            {
                start = filter.StartDate.Value;
            }

            DateTime?end = null;

            if (filter.EndDate.HasValue)
            {
                end = filter.EndDate.Value;
            }

            bool         hasStatus = filter.Status.HasValue;
            ModuleStatus status    = ModuleStatus.IN_FIELD;

            if (hasStatus)
            {
                status = filter.Status.Value;
            }

            var filteredQuery = _context.ModuleHistory.Include("Module.Field.Farm.Client").Include("Module.GinLoad").AsQueryable();

            if (!string.IsNullOrEmpty(filter.SerialNumber))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.Name == filter.SerialNumber);
            }

            if (filter.StartDate.HasValue)
            {
                filteredQuery = filteredQuery.Where(c => c.Created >= start.Value);
            }

            if (filter.EndDate.HasValue)
            {
                filteredQuery = filteredQuery.Where(c => c.Created <= end.Value);
            }

            if (!string.IsNullOrEmpty(fieldName))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.Field.Name == fieldName);
            }

            if (!string.IsNullOrEmpty(farmName))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.Field.Farm.Name == farmName);
            }

            if (!string.IsNullOrEmpty(clientName))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.Field.Farm.Client.Name == clientName);
            }

            if (!string.IsNullOrEmpty(filter.LoadNumber))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.LoadNumber == filter.LoadNumber);
            }

            if (!string.IsNullOrEmpty(filter.GinTicketLoadNumber))
            {
                filteredQuery = filteredQuery.Where(c => c.Module.GinTagLoadNumber == filter.GinTicketLoadNumber);
            }

            if (!string.IsNullOrEmpty(filter.TruckID))
            {
                filteredQuery = filteredQuery.Where(c => c.TruckID == filter.TruckID);
            }

            if (!string.IsNullOrEmpty(filter.Driver))
            {
                filteredQuery = filteredQuery.Where(c => c.Driver == filter.Driver);
            }

            if (filter.Status.HasValue)
            {
                filteredQuery = filteredQuery.Where(c => c.ModuleStatus == status);
            }

            IOrderedQueryable <ModuleHistoryEntity> orderable = null;

            if (filter.Sort1Ascending)
            {
                if (filter.SortCol1.ToLower() == "client")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol1.ToLower() == "farm")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol1.ToLower() == "field")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.Field.Name);
                }
                else if (filter.SortCol1.ToLower() == "serial no")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.Name);
                }
                else if (filter.SortCol1.ToLower() == "load #")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "gin ticket load #")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "bridge load #")
                {
                    orderable = filteredQuery.OrderBy(m => m.Module.BridgeLoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "truck id")
                {
                    orderable = filteredQuery.OrderBy(m => m.TruckID);
                }
                else if (filter.SortCol1.ToLower() == "driver")
                {
                    orderable = filteredQuery.OrderBy(m => m.Driver);
                }
                else if (filter.SortCol1.ToLower() == "status")
                {
                    orderable = filteredQuery.OrderBy(m => m.ModuleStatus);
                }
                else if (filter.SortCol1.ToLower() == "timestamp")
                {
                    orderable = filteredQuery.OrderBy(m => m.Created);
                }
                else if (filter.SortCol1.ToLower() == "created")
                {
                    orderable = filteredQuery.OrderBy(m => m.Created);
                }
                else if (filter.SortCol1.ToLower() == "updated")
                {
                    orderable = filteredQuery.OrderBy(m => m.Updated);
                }
            }
            else
            {
                if (filter.SortCol1.ToLower() == "client")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol1.ToLower() == "farm")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol1.ToLower() == "field")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.Field.Name);
                }
                else if (filter.SortCol1.ToLower() == "serial no")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.Name);
                }
                else if (filter.SortCol1.ToLower() == "load #")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "gin ticket load #")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "bridge load #")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Module.BridgeLoadNumber);
                }
                else if (filter.SortCol1.ToLower() == "truck id")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.TruckID);
                }
                else if (filter.SortCol1.ToLower() == "driver")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Driver);
                }
                else if (filter.SortCol1.ToLower() == "status")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.ModuleStatus);
                }
                else if (filter.SortCol1.ToLower() == "timestamp")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Created);
                }
                else if (filter.SortCol1.ToLower() == "created")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Created);
                }
                else if (filter.SortCol1.ToLower() == "updated")
                {
                    orderable = filteredQuery.OrderByDescending(m => m.Updated);
                }
            }

            if (filter.Sort2Ascending)
            {
                if (filter.SortCol2.ToLower() == "client")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol2.ToLower() == "farm")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol2.ToLower() == "field")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Name);
                }
                else if (filter.SortCol2.ToLower() == "serial no")
                {
                    orderable = orderable.ThenBy(m => m.Module.Name);
                }
                else if (filter.SortCol2.ToLower() == "load #")
                {
                    orderable = orderable.ThenBy(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "gin ticket load #")
                {
                    orderable.ThenBy(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "bridge load #")
                {
                    orderable.ThenBy(m => m.Module.GinLoad.ScaleBridgeLoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "truck id")
                {
                    orderable = orderable.ThenBy(m => m.TruckID);
                }
                else if (filter.SortCol2.ToLower() == "driver")
                {
                    orderable = orderable.ThenBy(m => m.Driver);
                }
                else if (filter.SortCol2.ToLower() == "status")
                {
                    orderable = orderable.ThenBy(m => m.ModuleStatus);
                }
                else if (filter.SortCol2.ToLower() == "timestamp")
                {
                    orderable = orderable.ThenBy(m => m.Created);
                }
                else if (filter.SortCol2.ToLower() == "created")
                {
                    orderable = orderable.ThenBy(m => m.Created);
                }
                else if (filter.SortCol2.ToLower() == "updated")
                {
                    orderable = orderable.ThenBy(m => m.Updated);
                }
            }
            else
            {
                if (filter.SortCol2.ToLower() == "client")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol2.ToLower() == "farm")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol2.ToLower() == "field")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Name);
                }
                else if (filter.SortCol2.ToLower() == "serial no")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Name);
                }
                else if (filter.SortCol2.ToLower() == "load #")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "gin ticket load #")
                {
                    orderable.ThenByDescending(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "bridge load #")
                {
                    orderable.ThenByDescending(m => m.Module.GinLoad.ScaleBridgeLoadNumber);
                }
                else if (filter.SortCol2.ToLower() == "truck id")
                {
                    orderable = orderable.ThenByDescending(m => m.TruckID);
                }
                else if (filter.SortCol2.ToLower() == "driver")
                {
                    orderable = orderable.ThenByDescending(m => m.Driver);
                }
                else if (filter.SortCol2.ToLower() == "status")
                {
                    orderable = orderable.ThenByDescending(m => m.ModuleStatus);
                }
                else if (filter.SortCol2.ToLower() == "timestamp")
                {
                    orderable = orderable.ThenByDescending(m => m.Created);
                }
                else if (filter.SortCol2.ToLower() == "created")
                {
                    orderable = orderable.ThenByDescending(m => m.Created);
                }
                else if (filter.SortCol2.ToLower() == "updated")
                {
                    orderable = orderable.ThenByDescending(m => m.Updated);
                }
            }

            if (filter.Sort3Ascending)
            {
                if (filter.SortCol3.ToLower() == "client")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol3.ToLower() == "farm")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol3.ToLower() == "field")
                {
                    orderable = orderable.ThenBy(m => m.Module.Field.Name);
                }
                else if (filter.SortCol3.ToLower() == "serial no")
                {
                    orderable = orderable.ThenBy(m => m.Module.Name);
                }
                else if (filter.SortCol3.ToLower() == "load #")
                {
                    orderable = orderable.ThenBy(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "gin ticket load #")
                {
                    orderable.ThenBy(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "bridge load #")
                {
                    orderable.ThenBy(m => m.Module.GinLoad.ScaleBridgeLoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "truck id")
                {
                    orderable = orderable.ThenBy(m => m.TruckID);
                }
                else if (filter.SortCol3.ToLower() == "driver")
                {
                    orderable = orderable.ThenBy(m => m.Driver);
                }
                else if (filter.SortCol3.ToLower() == "status")
                {
                    orderable = orderable.ThenBy(m => m.ModuleStatus);
                }
                else if (filter.SortCol3.ToLower() == "timestamp")
                {
                    orderable = orderable.ThenBy(m => m.Created);
                }
                else if (filter.SortCol3.ToLower() == "created")
                {
                    orderable = orderable.ThenBy(m => m.Created);
                }
                else if (filter.SortCol3.ToLower() == "updated")
                {
                    orderable = orderable.ThenBy(m => m.Updated);
                }
            }
            else
            {
                if (filter.SortCol3.ToLower() == "client")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Farm.Client.Name);
                }
                else if (filter.SortCol3.ToLower() == "farm")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Farm.Name);
                }
                else if (filter.SortCol3.ToLower() == "field")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Field.Name);
                }
                else if (filter.SortCol3.ToLower() == "serial no")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.Name);
                }
                else if (filter.SortCol3.ToLower() == "load #")
                {
                    orderable = orderable.ThenByDescending(m => m.Module.LoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "gin ticket load #")
                {
                    orderable.ThenByDescending(m => m.Module.GinTagLoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "bridge load #")
                {
                    orderable.ThenByDescending(m => m.Module.GinLoad.ScaleBridgeLoadNumber);
                }
                else if (filter.SortCol3.ToLower() == "truck id")
                {
                    orderable = orderable.ThenByDescending(m => m.TruckID);
                }
                else if (filter.SortCol3.ToLower() == "driver")
                {
                    orderable = orderable.ThenByDescending(m => m.Driver);
                }
                else if (filter.SortCol3.ToLower() == "status")
                {
                    orderable = orderable.ThenByDescending(m => m.ModuleStatus);
                }
                else if (filter.SortCol3.ToLower() == "timestamp")
                {
                    orderable = orderable.ThenByDescending(m => m.Created);
                }
                else if (filter.SortCol3.ToLower() == "created")
                {
                    orderable = orderable.ThenByDescending(m => m.Created);
                }
                else if (filter.SortCol3.ToLower() == "updated")
                {
                    orderable = orderable.ThenByDescending(m => m.Updated);
                }
            }

            return(orderable);
        }
示例#22
0
 public static void AddModule <T>(this DiscordClient client, T instance, string name = null, ModuleFilter filter = ModuleFilter.None)
     where T : class, IModule
 {
     client.GetService <ModuleService>().Add(instance, name, filter);
 }
示例#23
0
        /// <summary>
        /// Bump the version of changed modules or a specified module.
        /// </summary>
        private static void BumpVersions()
        {
            var changedModules = new List <string>();

            foreach (var directory in _projectDirectories)
            {
                var changeLogs = Directory.GetFiles(directory, "ChangeLog.md", SearchOption.AllDirectories)
                                 .Where(f => !ModuleFilter.IsAzureStackModule(f) && IsChangeLogUpdated(f))
                                 .Select(f => GetModuleManifestPath(Directory.GetParent(f).FullName))
                                 .Where(m => m.Contains(_moduleNameFilter))
                                 .ToList();
                changedModules.AddRange(changeLogs);
            }

            var executingAssemblyPath      = Assembly.GetExecutingAssembly().Location;
            var versionControllerDirectory = Directory.GetParent(executingAssemblyPath).FullName;
            var miniVersionFile            = Path.Combine(versionControllerDirectory, "MinimalVersion.csv");

            if (File.Exists(miniVersionFile))
            {
                var lines = File.ReadAllLines(miniVersionFile).Skip(1).Where(c => !string.IsNullOrEmpty(c));
                foreach (var line in lines)
                {
                    var cols = line.Split(",").Select(c => c.StartsWith("\"") ? c.Substring(1) : c)
                               .Select(c => c.EndsWith("\"") ? c.Substring(0, c.Length - 1) : c)
                               .Select(c => c.Trim()).ToArray();
                    if (cols.Length >= 2)
                    {
                        _minimalVersion.Add(cols[0], new AzurePSVersion(cols[1]));
                    }
                }
            }

            foreach (var projectModuleManifestPath in changedModules)
            {
                var moduleFileName = Path.GetFileName(projectModuleManifestPath);
                var moduleName     = moduleFileName.Replace(".psd1", "");

                var outputModuleManifest = _outputDirectories
                                           .SelectMany(d => Directory.GetDirectories(d, moduleName))
                                           .SelectMany(d => Directory.GetFiles(d, moduleFileName))
                                           .ToList();
                if (outputModuleManifest.Count == 0)
                {
                    throw new FileNotFoundException("No module manifest file found in output directories");
                }
                else if (outputModuleManifest.Count > 1)
                {
                    throw new IndexOutOfRangeException("Multiple module manifest files found in output directories");
                }

                var outputModuleManifestFile = outputModuleManifest.FirstOrDefault();

                _versionBumper = new VersionBumper(new VersionFileHelper(_rootDirectory, outputModuleManifestFile, projectModuleManifestPath));

                if (_minimalVersion.ContainsKey(moduleName))
                {
                    _versionBumper.MinimalVersion = _minimalVersion[moduleName];
                }

                _versionBumper.BumpAllVersions();
            }
        }
示例#24
0
 public static extern bool EnumProcessModulesEx(IntPtr hProcess, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)][In][Out] IntPtr[] lphModule, int cb, [MarshalAs(UnmanagedType.U4)] out int lpcbNeeded, ModuleFilter dwFilterFlag);
示例#25
0
        /// <summary>
        /// Given a set of directory paths containing PowerShell module folders,
        /// analyze the breaking changes in the modules and report any issues
        ///
        /// Filters can be added to find breaking changes for specific modules
        /// </summary>
        /// <param name="cmdletProbingDirs">Set of directory paths containing PowerShell module folders to be checked for breaking changes.</param>
        /// <param name="directoryFilter">Function that filters the directory paths to be checked.</param>
        /// <param name="cmdletFilter">Function that filters the cmdlets to be checked.</param>
        public void Analyze(
            IEnumerable <string> cmdletProbingDirs,
            Func <IEnumerable <string>, IEnumerable <string> > directoryFilter,
            Func <string, bool> cmdletFilter,
            IEnumerable <string> modulesToAnalyze)
        {
            var processedHelpFiles = new List <string>();
            var issueLogger        = Logger.CreateLogger <BreakingChangeIssue>("BreakingChangeIssues.csv");

            if (directoryFilter != null)
            {
                cmdletProbingDirs = directoryFilter(cmdletProbingDirs);
            }

            foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") &&
                                                                  !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s))))
            {
                SharedAssemblyLoader.Load(baseDirectory);
                var probingDirectories = new List <string> {
                    baseDirectory
                };

                // Add current directory for probing
                probingDirectories.AddRange(Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory)));

                foreach (var directory in probingDirectories)
                {
                    if (modulesToAnalyze != null &&
                        modulesToAnalyze.Any() &&
                        !modulesToAnalyze.Any(m => directory.EndsWith(m)))
                    {
                        continue;
                    }

                    var service = Path.GetFileName(directory);

                    var manifestFiles = Directory.EnumerateFiles(directory, "*.psd1").ToList();

                    if (manifestFiles.Count > 1)
                    {
                        manifestFiles = manifestFiles.Where(f => Path.GetFileName(f).IndexOf(service) >= 0).ToList();
                    }

                    if (manifestFiles.Count == 0)
                    {
                        continue;
                    }

                    var psd1            = manifestFiles.FirstOrDefault();
                    var parentDirectory = Directory.GetParent(psd1).FullName;
                    var psd1FileName    = Path.GetFileName(psd1);

                    string moduleName = psd1FileName.Replace(".psd1", "");

                    Console.WriteLine(directory);
                    Directory.SetCurrentDirectory(directory);

                    issueLogger.Decorator.AddDecorator(a => a.AssemblyFileName = moduleName, "AssemblyFileName");
                    processedHelpFiles.Add(moduleName);

                    var newModuleMetadata = MetadataLoader.GetModuleMetadata(moduleName);
                    var fileName          = $"{moduleName}.json";
                    var executingPath     = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath);

                    var filePath = Path.Combine(executingPath, "SerializedCmdlets", fileName);

                    if (!File.Exists(filePath))
                    {
                        continue;
                    }

                    var oldModuleMetadata = ModuleMetadata.DeserializeCmdlets(filePath);

                    if (cmdletFilter != null)
                    {
                        var output = string.Format("Before filter\nOld module cmdlet count: {0}\nNew module cmdlet count: {1}",
                                                   oldModuleMetadata.Cmdlets.Count, newModuleMetadata.Cmdlets.Count);

                        output += string.Format("\nCmdlet file: {0}", moduleName);

                        oldModuleMetadata.FilterCmdlets(cmdletFilter);
                        newModuleMetadata.FilterCmdlets(cmdletFilter);

                        output += string.Format("After filter\nOld module cmdlet count: {0}\nNew module cmdlet count: {1}",
                                                oldModuleMetadata.Cmdlets.Count, newModuleMetadata.Cmdlets.Count);

                        foreach (var cmdlet in oldModuleMetadata.Cmdlets)
                        {
                            output += string.Format("\n\tOld cmdlet - {0}", cmdlet.Name);
                        }

                        foreach (var cmdlet in newModuleMetadata.Cmdlets)
                        {
                            output += string.Format("\n\tNew cmdlet - {0}", cmdlet.Name);
                        }

                        issueLogger.WriteMessage(output + Environment.NewLine);
                    }

                    RunBreakingChangeChecks(oldModuleMetadata, newModuleMetadata, issueLogger);
                }
            }
        }
示例#26
0
        /// <summary>
        /// Given a set of directory paths containing PowerShell module folders,
        /// analyze the breaking changes in the modules and report any issues
        ///
        /// Filters can be added to find breaking changes for specific modules
        /// </summary>
        /// <param name="cmdletProbingDirs">Set of directory paths containing PowerShell module folders to be checked for breaking changes.</param>
        /// <param name="directoryFilter">Function that filters the directory paths to be checked.</param>
        /// <param name="cmdletFilter">Function that filters the cmdlets to be checked.</param>
        public void Analyze(
            IEnumerable <string> cmdletProbingDirs,
            Func <IEnumerable <string>, IEnumerable <string> > directoryFilter,
            Func <string, bool> cmdletFilter,
            IEnumerable <string> modulesToAnalyze)
        {
            var processedHelpFiles = new List <string>();
            var issueLogger        = Logger.CreateLogger <BreakingChangeIssue>("BreakingChangeIssues.csv");

            if (directoryFilter != null)
            {
                cmdletProbingDirs = directoryFilter(cmdletProbingDirs);
            }

            foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") &&
                                                                  !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s))))
            {
                var probingDirectories = new List <string> {
                    baseDirectory
                };

                // Add current directory for probing
                probingDirectories.AddRange(Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory)));

                foreach (var directory in probingDirectories)
                {
                    if (modulesToAnalyze != null &&
                        modulesToAnalyze.Any() &&
                        !modulesToAnalyze.Any(m => directory.EndsWith(m)))
                    {
                        continue;
                    }

                    var service = Path.GetFileName(directory);

                    var manifestFiles = Directory.EnumerateFiles(directory, "*.psd1").ToList();

                    if (manifestFiles.Count > 1)
                    {
                        manifestFiles = manifestFiles.Where(f => Path.GetFileName(f).IndexOf(service) >= 0).ToList();
                    }

                    if (manifestFiles.Count == 0)
                    {
                        continue;
                    }

                    var psd1            = manifestFiles.FirstOrDefault();
                    var parentDirectory = Directory.GetParent(psd1).FullName;
                    var psd1FileName    = Path.GetFileName(psd1);
                    var powershell      = PowerShell.Create();

                    var script = $"Import-LocalizedData -BaseDirectory {parentDirectory} -FileName {psd1FileName} -BindingVariable ModuleMetadata;";
                    powershell.AddScript($"{script} $ModuleMetadata.NestedModules;");
                    var cmdletResult  = powershell.Invoke();
                    var nestedModules = cmdletResult.Where(c => c != null).Select(c => c.ToString()).Select(c => (c.StartsWith(".") ? c.Substring(2) : c)).ToList();

                    powershell.AddScript($"{script} $ModuleMetadata.RequiredModules | % {{ $_[\"ModuleName\"] }};");
                    cmdletResult = powershell.Invoke();
                    var requiredModules = cmdletResult.Where(c => !c.ToString().StartsWith(".")).Select(c => c.ToString()).ToList();

                    if (!nestedModules.Any())
                    {
                        continue;
                    }

                    Directory.SetCurrentDirectory(directory);

                    requiredModules = requiredModules.Join(cmdletProbingDirs,
                                                           module => 1,
                                                           dir => 1,
                                                           (module, dir) => Path.Combine(dir, module))
                                      .Where(Directory.Exists)
                                      .ToList();

                    requiredModules.Add(directory);

                    foreach (var nestedModule in nestedModules)
                    {
                        var assemblyFile     = Directory.GetFiles(parentDirectory, nestedModule, SearchOption.AllDirectories).FirstOrDefault();
                        var assemblyFileName = Path.GetFileName(assemblyFile);
                        if (!File.Exists(assemblyFile))
                        {
                            continue;
                        }

                        issueLogger.Decorator.AddDecorator(a => a.AssemblyFileName = assemblyFileName, "AssemblyFileName");
                        processedHelpFiles.Add(assemblyFileName);
// TODO: Remove IfDef
#if NETSTANDARD
                        var proxy = new CmdletLoader();
#else
                        var proxy = EnvironmentHelpers.CreateProxy <CmdletLoader>(directory, out _appDomain);
#endif
                        var newModuleMetadata = proxy.GetModuleMetadata(assemblyFile, requiredModules);

                        var fileName      = assemblyFileName + ".json";
                        var executingPath =
                            Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath);

                        var filePath = executingPath + "\\SerializedCmdlets\\" + fileName;

#if SERIALIZE
                        SerializeCmdlets(filePath, newModuleMetadata);
#endif

                        if (!File.Exists(filePath))
                        {
                            continue;
                        }

                        var oldModuleMetadata = DeserializeCmdlets(filePath);

                        if (cmdletFilter != null)
                        {
                            var output = string.Format("Before filter\nOld module cmdlet count: {0}\nNew module cmdlet count: {1}",
                                                       oldModuleMetadata.Cmdlets.Count, newModuleMetadata.Cmdlets.Count);

                            output += string.Format("\nCmdlet file: {0}", assemblyFileName);

                            oldModuleMetadata.FilterCmdlets(cmdletFilter);
                            newModuleMetadata.FilterCmdlets(cmdletFilter);

                            output += string.Format("After filter\nOld module cmdlet count: {0}\nNew module cmdlet count: {1}",
                                                    oldModuleMetadata.Cmdlets.Count, newModuleMetadata.Cmdlets.Count);

                            foreach (var cmdlet in oldModuleMetadata.Cmdlets)
                            {
                                output += string.Format("\n\tOld cmdlet - {0}", cmdlet.Name);
                            }

                            foreach (var cmdlet in newModuleMetadata.Cmdlets)
                            {
                                output += string.Format("\n\tNew cmdlet - {0}", cmdlet.Name);
                            }

                            issueLogger.WriteMessage(output + Environment.NewLine);
                        }

                        RunBreakingChangeChecks(oldModuleMetadata, newModuleMetadata, issueLogger);
// TODO: Remove IfDef code
#if !NETSTANDARD
                        AppDomain.Unload(_appDomain);
#endif
                    }
                }
            }
        }
示例#27
0
 internal ModuleChecker(ModuleManager manager)
 {
     _manager    = manager;
     _filterType = manager.FilterType;
 }
示例#28
0
 public static extern bool EnumProcessModulesEx([In] IntPtr hProcess, [Out] IntPtr[] lphModule, [In] UInt32 cb,
                                                [Out] out UInt32 lpcbNeeded, [In] ModuleFilter dwFilterFlag);
示例#29
0
		internal ModuleChecker(ModuleManager manager)
		{
			_manager = manager;
			_filterType = manager.FilterType;
        }
示例#30
0
 internal static extern bool EnumProcessModulesEx(IntPtr h,
                                                  [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4), In, Out] IntPtr[] p,
                                                  uint cb, [MarshalAs(UnmanagedType.U4)] out uint size, ModuleFilter filter_flag);
示例#31
0
        private async Task<bool> CanChangeModuleStateInServer(ModuleManager module, ModuleFilter checkFilter,
            CommandEventArgs evnt, bool prviateCheck = true)
        {
            if (!module.FilterType.HasFlag(checkFilter))
            {
                await
                    evnt.Channel.SafeSendMessage($"This module doesn't support being enabled. (no `{checkFilter}` flag)");
                return false;
            }

            if (evnt.Channel.IsPrivate)
            {
                await evnt.Channel.SafeSendMessage("Moduel state changing is not allowed in private channels.");
                return false;
            }

            if (prviateCheck && PrivateModules.FirstOrDefault(m => m.ToLowerInvariant() == module.Id) != null &&
                evnt.User.Id != Constants.UserOwner)
            {
                await
                    evnt.Channel.SafeSendMessage("This module is private. Use }contact for more information.");
                return false;
            }
            return true;
        }
示例#32
0
 internal ModuleManager(DiscordClient client, T instance, string name, ModuleFilter filterType)
     : base(client, instance, name, filterType)
 {
 }
示例#33
0
        public void Analyze(IEnumerable <string> cmdletProbingDirs,
                            Func <IEnumerable <string>, IEnumerable <string> > directoryFilter,
                            Func <string, bool> cmdletFilter,
                            IEnumerable <string> modulesToAnalyze)
        {
            var savedDirectory     = Directory.GetCurrentDirectory();
            var processedHelpFiles = new List <string>();
            var issueLogger        = Logger.CreateLogger <SignatureIssue>(_signatureIssueReportLoggerName);

            var probingDirectories = new List <string>();

            if (directoryFilter != null)
            {
                cmdletProbingDirs = directoryFilter(cmdletProbingDirs);
            }

            foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") &&
                                                                  !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s))))
            {
                SharedAssemblyLoader.Load(baseDirectory);

                //Add current directory for probing
                probingDirectories.Add(baseDirectory);
                probingDirectories.AddRange(Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory)));

                foreach (var directory in probingDirectories)
                {
                    if (modulesToAnalyze != null &&
                        modulesToAnalyze.Any() &&
                        !modulesToAnalyze.Any(m => directory.EndsWith(m)))
                    {
                        continue;
                    }

                    var service       = Path.GetFileName(directory);
                    var manifestFiles = Directory.EnumerateFiles(directory, "*.psd1").ToList();
                    if (manifestFiles.Count > 1)
                    {
                        manifestFiles = manifestFiles.Where(f => Path.GetFileName(f).IndexOf(service) >= 0).ToList();
                    }

                    if (!manifestFiles.Any())
                    {
                        continue;
                    }

                    var    psd1            = manifestFiles.FirstOrDefault();
                    var    parentDirectory = Directory.GetParent(psd1).FullName;
                    var    psd1FileName    = Path.GetFileName(psd1);
                    string moduleName      = psd1FileName.Replace(".psd1", "");

                    Directory.SetCurrentDirectory(directory);

                    issueLogger.Decorator.AddDecorator(a => a.AssemblyFileName = moduleName, "AssemblyFileName");
                    processedHelpFiles.Add(moduleName);

                    var module = MetadataLoader.GetModuleMetadata(moduleName);
                    CmdletLoader.ModuleMetadata = module;
                    var cmdlets = module.Cmdlets;

                    if (cmdletFilter != null)
                    {
                        cmdlets = cmdlets.Where(cmdlet => cmdletFilter(cmdlet.Name)).ToList();
                    }

                    foreach (var cmdlet in cmdlets)
                    {
                        Logger.WriteMessage("Processing cmdlet '{0}'", cmdlet.ClassName);
                        const string defaultRemediation = "Determine if the cmdlet should implement ShouldProcess and " +
                                                          "if so determine if it should implement Force / ShouldContinue";
                        if (!cmdlet.SupportsShouldProcess && cmdlet.HasForceSwitch)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 0,
                                problemId: SignatureProblemId.ForceWithoutShouldProcessAttribute,
                                description: string.Format("{0} Has  -Force parameter but does not set the SupportsShouldProcess " +
                                                           "property to true in the Cmdlet attribute.", cmdlet.Name),
                                remediation: defaultRemediation);
                        }
                        if (!cmdlet.SupportsShouldProcess && cmdlet.ConfirmImpact != ConfirmImpact.Medium)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 2,
                                problemId: SignatureProblemId.ConfirmLeveleWithNoShouldProcess,
                                description:
                                string.Format("{0} Changes the ConfirmImpact but does not set the " +
                                              "SupportsShouldProcess property to true in the cmdlet attribute.",
                                              cmdlet.Name),
                                remediation: defaultRemediation);
                        }
                        if (!cmdlet.SupportsShouldProcess && cmdlet.IsShouldProcessVerb)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.ActionIndicatesShouldProcess,
                                description:
                                string.Format(
                                    "{0} Does not support ShouldProcess but the cmdlet verb {1} indicates that it should.",
                                    cmdlet.Name, cmdlet.VerbName),
                                remediation: defaultRemediation);
                        }
                        if (cmdlet.ConfirmImpact != ConfirmImpact.Medium)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 2,
                                problemId: SignatureProblemId.ConfirmLevelChange,
                                description:
                                string.Format("{0} changes the confirm impact.  Please ensure that the " +
                                              "change in ConfirmImpact is justified", cmdlet.Name),
                                remediation:
                                "Verify that ConfirmImpact is changed appropriately by the cmdlet. " +
                                "It is very rare for a cmdlet to change the ConfirmImpact.");
                        }
                        if (!cmdlet.IsApprovedVerb)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.CmdletWithUnapprovedVerb,
                                description:
                                string.Format(
                                    "{0} uses the verb '{1}', which is not on the list of approved " +
                                    "verbs for PowerShell commands. Use the cmdlet 'Get-Verb' to see " +
                                    "the full list of approved verbs and consider renaming the cmdlet.",
                                    cmdlet.Name, cmdlet.VerbName),
                                remediation: "Consider renaming the cmdlet to use an approved verb for PowerShell.");
                        }

                        if (!cmdlet.HasSingularNoun)
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.CmdletWithPluralNoun,
                                description:
                                string.Format(
                                    "{0} uses the noun '{1}', which does not follow the enforced " +
                                    "naming convention of using a singular noun for a cmdlet name.",
                                    cmdlet.Name, cmdlet.NounName),
                                remediation: "Consider using a singular noun for the cmdlet name.");
                        }

                        if (!cmdlet.OutputTypes.Any())
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.CmdletWithNoOutputType,
                                description:
                                string.Format(
                                    "Cmdlet '{0}' has no defined output type.", cmdlet.Name),
                                remediation: "Add an OutputType attribute that declares the type of the object(s) returned " +
                                "by this cmdlet. If this cmdlet returns no output, please set the output " +
                                "type to 'bool' and make sure to implement the 'PassThru' parameter.");
                        }

                        foreach (var parameter in cmdlet.GetParametersWithPluralNoun())
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.ParameterWithPluralNoun,
                                description:
                                string.Format(
                                    "Parameter {0} of cmdlet {1} does not follow the enforced " +
                                    "naming convention of using a singular noun for a parameter name.",
                                    parameter.Name, cmdlet.Name),
                                remediation: "Consider using a singular noun for the parameter name.");
                        }

                        foreach (var parameterSet in cmdlet.ParameterSets)
                        {
                            if (parameterSet.Name.Contains(" "))
                            {
                                issueLogger.LogSignatureIssue(
                                    cmdlet: cmdlet,
                                    severity: 1,
                                    problemId: SignatureProblemId.ParameterSetWithSpace,
                                    description:
                                    string.Format(
                                        "Parameter set '{0}' of cmdlet '{1}' contains a space, which " +
                                        "is discouraged for PowerShell parameter sets.",
                                        parameterSet.Name, cmdlet.Name),
                                    remediation: "Remove the space(s) in the parameter set name.");
                            }

                            if (parameterSet.Parameters.Any(p => p.Position >= 4))
                            {
                                issueLogger.LogSignatureIssue(
                                    cmdlet: cmdlet,
                                    severity: 1,
                                    problemId: SignatureProblemId.ParameterWithOutOfRangePosition,
                                    description:
                                    string.Format(
                                        "Parameter set '{0}' of cmdlet '{1}' contains at least one parameter " +
                                        "with a position larger than four, which is discouraged.",
                                        parameterSet.Name, cmdlet.Name),
                                    remediation: "Limit the number of positional parameters in a single parameter set to " +
                                    "four or fewer.");
                            }
                        }

                        if (cmdlet.ParameterSets.Count > 2 && cmdlet.DefaultParameterSetName == "__AllParameterSets")
                        {
                            issueLogger.LogSignatureIssue(
                                cmdlet: cmdlet,
                                severity: 1,
                                problemId: SignatureProblemId.MultipleParameterSetsWithNoDefault,
                                description:
                                string.Format(
                                    "Cmdlet '{0}' has multiple parameter sets, but no defined default parameter set.",
                                    cmdlet.Name),
                                remediation: "Define a default parameter set in the cmdlet attribute.");
                        }

                        ValidateParameterSetWithMandatoryEqual(cmdlet, issueLogger);
                        ValidateParameterSetWithLenientMandatoryEqual(cmdlet, issueLogger);
                    }
                    issueLogger.Decorator.Remove("AssemblyFileName");
                    Directory.SetCurrentDirectory(savedDirectory);
                }
            }
        }