コード例 #1
0
        static IHasDiagnostics  Add(this IHasDiagnostics hasDiags, Diagnostic.Types.Severity severity,
                                    string summary, string detail = null, TFSteps steps = null)
        {
            if (hasDiags.Diagnostics == null)
            {
                hasDiags.Diagnostics = new TFDiagnostics();
            }

            hasDiags.Diagnostics._diagnostics.Add(new Diagnostic
            {
                Severity  = severity,
                Summary   = summary ?? string.Empty,
                Detail    = detail ?? string.Empty,
                Attribute = steps?.ToPath(),
            });
            return(hasDiags);
        }
コード例 #2
0
        private IDscRes DscResApplyConfig(IHasDiagnostics result, IDscRes config,
                                          out bool rebootRequired)
        {
            using var ses = CimSession.Create(config.ComputerName ?? DscRes.DefaultCimHostname);
            using var cls = ses.GetClass(DscRes.DscCimNamespace, config.TypeName);
            using var cim = new CimInstance(DscRes.LcmCimClassName, DscRes.DscCimNamespace);

            var mofBody = DscRes.BuildMof(config, cls);

            _log.LogDebug("Generated MOF:\n{0}", mofBody);
            var mofBodyBytes = DscRes.ToUint8(mofBody);
            var methodParams = new CimMethodParametersCollection
            {
                CimMethodParameter.Create("ModuleName", config.ModuleName, CimFlags.None),
                CimMethodParameter.Create("ResourceType", config.TypeName, CimFlags.None),
                CimMethodParameter.Create("resourceProperty", mofBodyBytes, CimFlags.None),
            };

            CimMethodResult methodResult;

            lock (_dscSync) {
                methodResult = ses.InvokeMethod(cim, "ResourceSet", methodParams);
            }
            rebootRequired = (bool)methodResult.OutParameters["RebootRequired"].Value;

            lock (_dscSync) {
                methodResult = ses.InvokeMethod(cim, "ResourceGet", methodParams);
            }
            var dscResConfigs = (CimInstance)methodResult.OutParameters["configurations"].Value;

            var state = config;

            state.Results = new Dictionary <string, string>();
            foreach (var p in dscResConfigs.CimInstanceProperties)
            {
                state.Results[p.Name] = p.Value?.ToString() ?? string.Empty;
            }

            lock (_dscSync) {
                methodResult = ses.InvokeMethod(cim, "ResourceTest", methodParams);
            }
            state.InDesiredState = (bool)methodResult.OutParameters["InDesiredState"].Value;

            return(state);
        }
コード例 #3
0
        private bool DscResTestConfig(IHasDiagnostics result, IDscRes config)
        {
            using var ses = CimSession.Create(config.ComputerName ?? DscRes.DefaultCimHostname);
            using var cls = ses.GetClass(DscRes.DscCimNamespace, config.TypeName);
            using var cim = new CimInstance(DscRes.LcmCimClassName, DscRes.DscCimNamespace);

            var mofBody = DscRes.BuildMof(config, cls);

            _log.LogDebug("Generated MOF:\n{0}", mofBody);
            var mofBodyBytes = DscRes.ToUint8(mofBody);
            var methodParams = new CimMethodParametersCollection
            {
                CimMethodParameter.Create("ModuleName", config.ModuleName, CimFlags.None),
                CimMethodParameter.Create("ResourceType", config.TypeName, CimFlags.None),
                CimMethodParameter.Create("resourceProperty", mofBodyBytes, CimFlags.None),
            };

            CimMethodResult methodResult;

            lock (_dscSync) {
                methodResult = ses.InvokeMethod(cim, "ResourceTest", methodParams);
            }
            return((bool)methodResult.OutParameters["InDesiredState"].Value);
        }
コード例 #4
0
 public static IHasDiagnostics  AddWarning(this IHasDiagnostics hasDiags, string summary, string detail = null, TFSteps steps = null) =>
 Add(hasDiags, Diagnostic.Types.Severity.Warning, summary, detail, steps);
コード例 #5
0
        private void DscResValidateConfig(IHasDiagnostics result, IDscRes config)
        {
            using var ses = CimSession.Create(config.ComputerName ?? DscRes.DefaultCimHostname);
            using var cls = ses.GetClass(DscRes.DscCimNamespace, config.TypeName);

            _log.LogDebug("Got CIM Class: {0}", config.TypeName);
            foreach (var p in cls.CimClassProperties)
            {
                _log.LogDebug("  * {0}: {1}; {2}; {3}; {4}",
                              p.Name,
                              p.CimType,
                              p.Flags,
                              p.ReferenceClassName,
                              string.Join(",", p.Qualifiers?.Select(q => q.Name)));
            }
            if (cls.CimClassProperties.Count == 0)
            {
                result.AddError("Failed to get CIM Class properties");
            }


            // First check for required params
            foreach (var p in cls.CimClassProperties)
            {
                if (p.Qualifiers.Any(q => q.Name == "key"))
                {
                    if (!config.Properties.ContainsKey(p.Name))
                    {
                        result.AddError($"missing mandatory DSC resource property: [{p.Name}]");
                    }
                }
            }

            // Check for existence, writability and value compatibility
            foreach (var c in config.Properties)
            {
                var p = cls.CimClassProperties.FirstOrDefault(p =>
                                                              p.Name.Equals(c.Key, StringComparison.OrdinalIgnoreCase));
                if (p == null)
                {
                    result.AddError($"unknown DSC resource property [{c.Key}]");
                    continue;
                }

                if (!p.Qualifiers.Any(q => q.Name == "write" || q.Name == "key"))
                {
                    result.AddError($"cannot set readonly DSC resource property [{p.Name}]");
                    continue;
                }

                if (p.CimType == CimType.Unknown)
                {
                    result.AddError($"cannot convert DSC resource property [{p.Name}] to [{p.CimType}]");
                    continue;
                }
                if (!DscRes.CanConvertTo(c.Value, p.CimType))
                {
                    result.AddError($"cannot convert DSC resource property [{p.Name}] to [{p.CimType}]");
                    continue;
                }

                if (p.Qualifiers.FirstOrDefault(q => q.Name == "ValueMap") is CimQualifier q)
                {
                    var validValues = (IEnumerable <string>)q.Value;
                    if (p.CimType == CimType.String)
                    {
                        if (!validValues.Contains(c.Value))
                        {
                            result.AddError($"invalid DSC resource property [{p.Name}]"
                                            + $" - must be one of [{string.Join(",", validValues)}]");
                        }
                    }
                    else if (p.CimType == CimType.StringArray)
                    {
                        var canConvert = DscRes.TryConvertToArray <string>(c.Value, out var values);
                        if (values.Any(v => !validValues.Contains(v)))
                        {
                            result.AddError($"invalid DSC resource property [{p.Name}]"
                                            + $" - must restrict to [{string.Join(",", validValues)}]");
                        }
                    }
                    else
                    {
                        result.AddError($"invalid DSC resource property [{p.Name}]"
                                        + $" - don't know how to match {p.CimType} to restricted values");
                    }
                    continue;
                }
            }
        }
コード例 #6
0
 public static IHasDiagnostics Invalid(this IHasDiagnostics hasDiags, string summary, string detail = null, TFSteps steps = null) =>
 Add(hasDiags, Diagnostic.Types.Severity.Invalid, summary, detail, steps);
コード例 #7
0
        private void ComputeState(FileResource state, FileResource newState, IHasDiagnostics diags)
        {
            if (string.IsNullOrEmpty(state?.Path))
            {
                return;
            }

            newState.CopyArgumentsFrom(state);
            var file = new FileInfo(state.Path);

            if (file.Exists)
            {
                newState.FullPath     = file.FullName;
                newState.LastModified = file.LastWriteTime.ToString("r");

                var csumKey = newState.ComputeChecksum;
                if (!string.IsNullOrEmpty(csumKey))
                {
                    System.Security.Cryptography.HashAlgorithm csumAlgor = null;
                    switch (csumKey)
                    {
                    case FileResource.MD5ChecksumKey:
                        csumAlgor = System.Security.Cryptography.MD5.Create();
                        break;

                    case FileResource.SHA1ChecksumKey:
                        csumAlgor = System.Security.Cryptography.SHA1.Create();
                        break;

                    case FileResource.SHA256ChecksumKey:
                        csumAlgor = System.Security.Cryptography.SHA256.Create();
                        break;

                    case FileResource.SourceCodeHashKey:
                        csumAlgor = System.Security.Cryptography.MD5.Create();
                        break;

                    default:
                        diags.Error("invalid checksum key");
                        break;
                    }

                    if (csumAlgor != null)
                    {
                        byte[] csum;
                        using (csumAlgor)
                            using (var fs = file.OpenRead())
                            {
                                csum = csumAlgor.ComputeHash(fs);
                            }

                        if (csumKey == FileResource.SourceCodeHashKey)
                        {
                            newState.Checksum = Convert.ToBase64String(csum);
                        }
                        else
                        {
                            newState.Checksum = BitConverter.ToString(csum).Replace("-", "");
                        }
                    }
                }
            }
        }