public static void InstallModules(DscRepository repository, DscServerNode serverNode) { if (serverNode == null) { return; } List <PsConfiguration> configurations = serverNode.GetConfigurations(); foreach (PsConfiguration configuration in configurations) { InstallModules(repository, configuration.Servers, configuration.GetUsedModules(repository)); } }
// Load DscRepository from specific path and fill UI private void LoadRepository(string path) { _repository = new DscRepository(path); _repositoryWorker = new RepositoryWorker(_repository); treeLibrary.Nodes["tviResources"].Nodes.Clear(); treeLibrary.Nodes["tviRoles"].Nodes.Clear(); treeLibrary.Nodes["tviServers"].Nodes.Clear(); FillResourceTree(); FillRoleTree(_repository.Roles, treeLibrary.Nodes["tviRoles"]); FillServerTree(_repository.Servers, treeLibrary.Nodes["tviServers"]); UnblockModules(); ModuleWorker.InstallLocalModules(_repository); }
public static void InstallModules(DscRepository repository, HashSet <string> servers, HashSet <string> modules) { foreach (string module in modules) { if (module == "PSDesiredStateConfiguration") { continue; } foreach (string server in servers) { string source = repository.Dir.Modules + module; string destination = "\\\\" + server + "\\C$\\Program Files\\WindowsPowerShell\\Modules\\" + module; if (!Directory.Exists(destination)) { FileSystem.DirectoryCopy(source, destination); } } } }
public static void InstallLocalModules(DscRepository repository) { string documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); FileSystem.DirectoryCreateIfNotExists(documents + "\\WindowsPowerShell"); FileSystem.DirectoryCreateIfNotExists(documents + "\\WindowsPowerShell\\Modules"); foreach (DscModule module in repository.Modules) { if (module.Name == "PSDesiredStateConfiguration") { continue; } string destination = documents + "\\WindowsPowerShell\\Modules\\" + module.Name; if (!Directory.Exists(destination)) { FileSystem.DirectoryCopy(module.DirectoryPath, destination); } } }
public HashSet <string> GetUsedModules(DscRepository repository) { HashSet <string> modules = new HashSet <string>(); HashSet <string> resourceStrings = new HashSet <string>(); foreach (string roleString in Roles) { DscRoleNode roleNode = repository.Roles.GetRoleNode(roleString); resourceStrings.UnionWith(roleNode.Role.Resources); } foreach (string resourceString in resourceStrings) { DscConfigurationItemNode configurationItemNode = repository.GetConfigurationItemNode(resourceString); if (configurationItemNode.Parent.Parent.Name != "PSDesiredStateConfiguration") { modules.Add(configurationItemNode.Parent.Parent.Name); } } return(modules); }
private static List <string> GetConfigText(PsConfiguration configuration, DscRepository repository) { List <string> configText = new List <string> { "Configuration Config_" + configuration.GetId(), "{", "Param", "(" }; for (int i = 0; i < configuration.Variables.Keys.Count; i++) { if (i == configuration.Variables.Keys.Count - 1) { configText.Add("$" + configuration.Variables.Keys.ElementAt(i)); } else { configText.Add("$" + configuration.Variables.Keys.ElementAt(i) + ","); } } configText.Add(")"); configText.AddRange(configuration.GetUsedModules(repository).Select(module => "Import-DscResource -Module " + module)); configText.AddRange(new List <string> { "Node $AllNodes.Nodename", "{" }); HashSet <string> resourceStrings = new HashSet <string>(); foreach (string roleString in configuration.Roles) { DscRoleNode roleNode = repository.Roles.GetRoleNode(roleString); resourceStrings.UnionWith(roleNode.Role.Resources); } foreach (string resourceString in resourceStrings) { DscConfigurationItemNode configurationItemNode = repository.GetConfigurationItemNode(resourceString); configText.AddRange(GetConfigurationItemText(configurationItemNode, repository)); } configText.AddRange(new List <string> { "}", "}" }); return(configText); }
private static List <string> GetConfigurationItemText(DscConfigurationItemNode node, DscRepository repository) { List <string> itemText = new List <string> { node.Parent.FriendlyName + " \"" + node.Name + "\"", "{" }; foreach (DictionaryEntry entry in node.ConfigurationItem.Properties) { if (((entry.Value == null) || (entry.Value.ToString() == "")) && !node.Parent.GetRequiredOf(entry.Key.ToString())) { continue; } switch (node.Parent.GetVariableTypeOf(entry.Key.ToString())) { case DscResource.VariableType.String: if ((entry.Value != null) && (entry.Value.ToString().StartsWith("$") || entry.Value.ToString().StartsWith("\""))) { itemText.Add(entry.Key + " = " + entry.Value); } else { itemText.Add(entry.Key + " = \"" + entry.Value + "\""); } break; case DscResource.VariableType.Boolean: itemText.Add(entry.Key + " = $" + entry.Value); break; case DscResource.VariableType.Uint16: case DscResource.VariableType.Sint16: case DscResource.VariableType.Uint32: case DscResource.VariableType.Sint32: case DscResource.VariableType.Uint64: case DscResource.VariableType.Sint64: itemText.Add(entry.Key + " = " + entry.Value); break; default: itemText.Add(entry.Key + " = \"" + entry.Value + "\""); break; } } if (node.ConfigurationItem.DependsOn.Count > 0) { List <string> dependsOn = new List <string>(); foreach (string dependency in node.ConfigurationItem.DependsOn) { DscConfigurationItemNode dependencyNode = repository.GetConfigurationItemNode(dependency); dependsOn.Add("'[" + dependencyNode.Parent.FriendlyName + "]" + dependencyNode.Name + "'"); } itemText.Add("DependsOn = " + string.Join(",", dependsOn)); } itemText.Add("}"); return(itemText); }
public static List <string> BuildScript(List <PsConfiguration> configurations, DscRepository repository) { List <string> script = new List <string>(); foreach (PsConfiguration configuration in configurations) { script.AddRange(GetConfigData(configuration)); script.AddRange(configuration.Variables.Select(variable => "$" + variable.Key + "_" + configuration.GetId() + " = " + variable.Value)); } foreach (PsConfiguration configuration in configurations) { script.AddRange(GetConfigText(configuration, repository)); } foreach (PsConfiguration configuration in configurations) { string varParameters = configuration.Variables.Aggregate("", (current, variable) => current + (" -" + variable.Key + " $" + variable.Key + "_" + configuration.GetId())); script.Add("Config_" + configuration.GetId() + " -ConfigurationData $ConfigData_" + configuration.GetId() + varParameters); script.Add("Start-DscConfiguration -Path Config_" + configuration.GetId() + " -force -wait -verbose"); } script.Add("Write-Host 'Press any key to continue ...'"); script.Add("$x = $host.UI.RawUI.ReadKey(\"NoEcho, IncludeKeyDown\")"); return(Tabulate(script)); }
public RepositoryWorker(DscRepository repository) { _repository = repository; }