/// <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); } } } }
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); } }
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); }
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); }
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); }
public FilterInformation() { Sort = string.Empty; Area = new AreaFilter(); Module = new ModuleFilter(); Action = new ActionFilter(); User = new UserFilter(); }
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); }
/// <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); }
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); }; }
/// <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 } }; } }
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); } }
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); }
/// <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); } } } } }
/// <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(); } }
//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); }
public static void AddModule(this DiscordClient client, IModule instance, string name = null, ModuleFilter filter = ModuleFilter.None) { client.GetService <ModuleService>().Add(instance, name, filter); }
/// <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); } } }
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); } }
public IEnumerable <ModuleHistoryEntity> GetAllMatchingLocations(ModuleFilter filter) { return(this.GetFilteredEventQuery(filter).ToList()); }
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); }
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); }
/// <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(); } }
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);
/// <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); } } }
/// <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 } } } }
internal ModuleChecker(ModuleManager manager) { _manager = manager; _filterType = manager.FilterType; }
public static extern bool EnumProcessModulesEx([In] IntPtr hProcess, [Out] IntPtr[] lphModule, [In] UInt32 cb, [Out] out UInt32 lpcbNeeded, [In] ModuleFilter dwFilterFlag);
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);
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; }
internal ModuleManager(DiscordClient client, T instance, string name, ModuleFilter filterType) : base(client, instance, name, filterType) { }
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); } } }