diff --git a/.vscode/equipment-automation-framework-cell-instance-status.http b/.vscode/equipment-automation-framework-cell-instance-status.http new file mode 100644 index 0000000..4932b4a --- /dev/null +++ b/.vscode/equipment-automation-framework-cell-instance-status.http @@ -0,0 +1,4 @@ +@host = eaf-prod.mes.infineon.com:9003 + +POST {{host}}/StatusQuery +Accept: application/json diff --git a/.vscode/launch.json b/.vscode/launch.json index e3e9a60..fa2420b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,6 +11,26 @@ "preLaunchTask": "build", "program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/File-Folder-Helper.dll", "args": [ + "s", + "X", + "D:/Tmp", + "Day-Helper-2025-06-02", + "infineon\\MESPhares", + "BACKLOG~BIORAD2~BIORAD3~BIORAD4~BIORAD5~CDE4~CDE5~CDE6~DEP08CEPIEPSILON~DEP08SIASM~DEP08SIHTRPLC~EC~HGCV1~HGCV2~HGCV3~MESAFIBACKLOG~MET06AWCT~MET08ANLYSDIFAAST230~MET08AWCT~MET08DDUPSFS6420~MET08DDUPSP1TBI~MET08RESIHGCV~MET08RESIMAPCDE~MET08RESISRP2100~MET08THFTIRQS408M~MET08THFTIRSTRATUS~METCLIMATEC~R29~R32~R36~R47~R55~R57~R61~R62~R65~R70~R72~R73~R74~R75~R77~SP101~SPV01~SRP~TENCOR1~TENCOR2~TENCOR3~TRENDLOG~WC6INCH1~WC6INCH2~WC6INCH3~WC6INCH4~WC8INCH1~WC8INCH2~WC8INCH3", + "s", + "X", + "D:/5-Other-Small/Proxmox/ffnm", + "Day-Helper-2025-05-21", + "*.pdf", + "*.md", + "2", + "MM-dd-yy", + "Trans Date~Effective Date~Description~Withdrawal Deposit~Balance", + "s", + "X", + "D:/Tmp/phares/VisualStudioCode", + "Day-Helper-2025-05-19", + "D:/Tmp/phares/VisualStudioCode/.vscode/input.json", "s", "X", "D:/Tmp/phares/VisualStudioCode", @@ -22,14 +42,14 @@ "/api/SyncV1/?", ",L", ".G", - "+|G||L|+|Custom-Default", + "+~G~~L~+~Custom-Default", "", - "+|G||G|-|Mirror", - "+|G||||Update", - "+|G||L|+|Custom-Default", - "-|G||G|+|Custom-A", - "-|L||L|+|Custom-B", - "+|L||L|-|Custom-C", + "+~G~~G~-~Mirror", + "+~G~~~~Update", + "+~G~~L~+~Custom-Default", + "-~G~~G~+~Custom-A", + "-~L~~L~+~Custom-B", + "+~L~~L~-~Custom-C", "s", "X", "\\\\mesfs.infineon.com\\EC_Characterization_Si\\Archive\\BIORAD4\\2025_Week_16\\2025-04-17", diff --git a/.vscode/settings.json b/.vscode/settings.json index 182f6a1..d7f8761 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,8 @@ "**/node_modules": true }, "cSpell.words": [ + "abcdefghiklmnopqrstuvwxyz", + "Acks", "ASPNETCORE", "BIORAD", "BIRT", @@ -21,6 +23,7 @@ "FAMS", "Gatus", "GIVN", + "HGCV", "HUSB", "Immich", "INDI", @@ -31,6 +34,7 @@ "Linc", "mesfs", "mestsa", + "netrm", "NpgSql", "NSFX", "OBJE", @@ -44,9 +48,11 @@ "Reparse", "Rijndael", "Serilog", + "startable", "SUBM", "SURN", "SYSLIB", + "TENCOR", "VSTS", "WIQL", "WSJF" diff --git a/ADO2025/PI6/Envelope.cs b/ADO2025/PI6/Envelope.cs new file mode 100644 index 0000000..9516d89 --- /dev/null +++ b/ADO2025/PI6/Envelope.cs @@ -0,0 +1,277 @@ +#nullable disable +#pragma warning disable CS8603 +#pragma warning disable CS8632 +#pragma warning disable IDE1006 + +namespace IFX.Shared.PasteSpecialXml.EAF.XML.API.Envelope; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2003/05/soap-envelope")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://www.w3.org/2003/05/soap-envelope", IsNullable = false)] +public partial class Envelope +{ + + private EnvelopeHeader? headerField; + + private EnvelopeBody? bodyField; + + /// + public EnvelopeHeader Header + { + get => this.headerField; + set => this.headerField = value; + } + + /// + public EnvelopeBody Body + { + get => this.bodyField; + set => this.bodyField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2003/05/soap-envelope")] +public partial class EnvelopeHeader +{ + + private Sequence? sequenceField; + private SequenceAcknowledgement? sequenceAcknowledgementField; + private Action? actionField; + + private string? relatesToField; + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] + public Sequence Sequence + { + get => this.sequenceField; + set => this.sequenceField = value; + } + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] + public SequenceAcknowledgement SequenceAcknowledgement + { + get => this.sequenceAcknowledgementField; + set => this.sequenceAcknowledgementField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://www.w3.org/2005/08/addressing")] + public Action Action + { + get => this.actionField; + set => this.actionField = value; + } + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://www.w3.org/2005/08/addressing")] + public string RelatesTo + { + get => this.relatesToField; + set => this.relatesToField = value; + } +} +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm", IsNullable = false)] +public partial class Sequence +{ + private string? identifierField; + private byte messageNumberField; + private object? lastMessageField; + private byte mustUnderstandField; + /// + public string Identifier + { + get => this.identifierField; + set => this.identifierField = value; + } + /// + public byte MessageNumber + { + get => this.messageNumberField; + set => this.messageNumberField = value; + } + /// + public object LastMessage + { + get => this.lastMessageField; + set => this.lastMessageField = value; + } + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/2003/05/soap-envelope")] + public byte mustUnderstand + { + get => this.mustUnderstandField; + set => this.mustUnderstandField = value; + } +} +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm", IsNullable = false)] +public partial class SequenceAcknowledgement +{ + private string? identifierField; + private SequenceAcknowledgementAcknowledgementRange? acknowledgementRangeField; + private byte bufferRemainingField; + /// + public string Identifier + { + get => this.identifierField; + set => this.identifierField = value; + } + /// + public SequenceAcknowledgementAcknowledgementRange AcknowledgementRange + { + get => this.acknowledgementRangeField; + set => this.acknowledgementRangeField = value; + } + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.microsoft.com/ws/2006/05/rm")] + public byte BufferRemaining + { + get => this.bufferRemainingField; + set => this.bufferRemainingField = value; + } +} +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +public partial class SequenceAcknowledgementAcknowledgementRange +{ + private byte lowerField; + private byte upperField; + /// + [System.Xml.Serialization.XmlAttribute()] + public byte Lower + { + get => this.lowerField; + set => this.lowerField = value; + } + /// + [System.Xml.Serialization.XmlAttribute()] + public byte Upper + { + get => this.upperField; + set => this.upperField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/08/addressing")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://www.w3.org/2005/08/addressing", IsNullable = false)] +public partial class Action +{ + + private byte mustUnderstandField; + + private string? valueField; + + /// + [System.Xml.Serialization.XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://www.w3.org/2003/05/soap-envelope")] + public byte mustUnderstand + { + get => this.mustUnderstandField; + set => this.mustUnderstandField = value; + } + + /// + [System.Xml.Serialization.XmlText()] + public string Value + { + get => this.valueField; + set => this.valueField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2003/05/soap-envelope")] +public partial class EnvelopeBody +{ + + private CreateSequenceResponse? createSequenceResponseField; + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] + public CreateSequenceResponse CreateSequenceResponse + { + get => this.createSequenceResponseField; + set => this.createSequenceResponseField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +[System.Xml.Serialization.XmlRoot(Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm", IsNullable = false)] +public partial class CreateSequenceResponse +{ + + private string? identifierField; + + private CreateSequenceResponseAccept? acceptField; + + /// + public string Identifier + { + get => this.identifierField; + set => this.identifierField = value; + } + + /// + public CreateSequenceResponseAccept Accept + { + get => this.acceptField; + set => this.acceptField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +public partial class CreateSequenceResponseAccept +{ + + private CreateSequenceResponseAcceptAcksTo? acksToField; + + /// + public CreateSequenceResponseAcceptAcksTo AcksTo + { + get => this.acksToField; + set => this.acksToField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm")] +public partial class CreateSequenceResponseAcceptAcksTo +{ + + private string? addressField; + + /// + [System.Xml.Serialization.XmlElement(Namespace = "http://www.w3.org/2005/08/addressing")] + public string Address + { + get => this.addressField; + set => this.addressField = value; + } +} \ No newline at end of file diff --git a/ADO2025/PI6/Helper-2025-06-01.cs b/ADO2025/PI6/Helper-2025-06-01.cs new file mode 100644 index 0000000..4e058e8 --- /dev/null +++ b/ADO2025/PI6/Helper-2025-06-01.cs @@ -0,0 +1,394 @@ + +using System.Collections.ObjectModel; +using System.Globalization; +using System.Net; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using IFX.Shared.PasteSpecialXml.EAF.XML.API.Envelope; + +using Microsoft.Extensions.Logging; + +namespace File_Folder_Helper.ADO2025.PI6; + +internal static partial class Helper20250601 { + + private static readonly bool _IsEnvironment_Development = false; + + private record Record(string Text, string Host, int Port, string[] Segments, bool StateContainsDisabled); + + private record Status(string CellInstanceName, + string CommunicationState, + string CurrentActiveVersion, + string CurrentHost, + string ErrorDescription, + string Host, + string IsReadyForRestart, + string NPort, + int Port, + string StartTime, + string Startable, + string State, + string StopTime, + string Text); + + internal static void EquipmentAutomationFrameworkStatus(ILogger logger, List args) { + Status status; + Record? record; + List messages; + logger.LogInformation(args[0]); + logger.LogInformation(args[1]); + logger.LogInformation(args[2]); + string[] cellInstanceNames = args[2].Split('~'); + Dictionary records; + if (_IsEnvironment_Development) { + records = GetEquipmentAutomationFrameworkCellInstanceStatus(development: true, staging: false, production: false); + } else { + records = GetEquipmentAutomationFrameworkCellInstanceStatus(development: false, staging: true, production: true); + } + foreach (string cellInstanceName in cellInstanceNames) { + if (!records.TryGetValue(cellInstanceName, out record)) { + logger.LogWarning("{cellInstance} not found!", cellInstanceName); + continue; + } + status = EquipmentAutomationFrameworkCellInstanceStatus(cellInstanceName, record); + logger.LogInformation("{host}) {cellInstanceName} => {status}", record.Host, cellInstanceName, status.ToString()); + } + } + + private static Dictionary GetEquipmentAutomationFrameworkCellInstanceStatus(bool development, bool staging, bool production) { + Dictionary results = []; + string key; + string host; + string text; + string state; + string response; + bool stop = false; + string[] segments; + string[] cellNames; + byte[] responseBytes; + string responseAfter; +#pragma warning disable SYSLIB0014 + WebClient webClient = new(); +#pragma warning restore SYSLIB0014 + string disabled = "Disabled"; + UnicodeCategory unicodeCategory; + StringBuilder stringBuilder = new(); + EquipmentAutomationFrameworkCellInstanceParseCheck(); + Dictionary unicodeReplaces = GetUnicodeReplaces(); + List unicodeCategories = GetUnicodeCategory(); + ReadOnlyCollection urls = GetUrls(development, staging, production); + // Dictionary> unicodeCategoriesList = new Dictionary>(); + byte[] bodyBytes = [86, 2, 11, 1, 115, 4, 11, 1, 97, 6, 86, 8, 68, 10, 30, 0, 130, 153, 48, 104, 116, 116, 112, 58, 47, 47, 116, 101, 109, 112, 117, 114, 105, 46, 111, 114, 103, 47, 73, 83, 116, 97, 116, 117, 115, 81, 117, 101, 114, 121, 47, 71, 101, 116, 70, 97, 99, 116, 111, 114, 121, 83, 116, 97, 116, 117, 115, 68, 26, 173, 181, 241, 2, 149, 65, 209, 208, 66, 143, 234, 233, 157, 246, 118, 78, 238, 68, 44, 68, 42, 171, 20, 1, 68, 12, 30, 0, 130, 153, 49, 104, 116, 116, 112, 58, 47, 47, 101, 97, 102, 45, 112, 114, 111, 100, 46, 109, 101, 115, 46, 105, 110, 102, 105, 110, 101, 111, 110, 46, 99, 111, 109, 58, 57, 48, 48, 51, 47, 83, 116, 97, 116, 117, 115, 81, 117, 101, 114, 121, 1, 86, 14, 64, 16, 71, 101, 116, 70, 97, 99, 116, 111, 114, 121, 83, 116, 97, 116, 117, 115, 8, 19, 104, 116, 116, 112, 58, 47, 47, 116, 101, 109, 112, 117, 114, 105, 46, 111, 114, 103, 47, 64, 16, 105, 110, 99, 108, 117, 100, 101, 65, 103, 101, 110, 116, 76, 105, 115, 116, 135, 64, 17, 105, 110, 99, 108, 117, 100, 101, 83, 116, 97, 116, 117, 115, 76, 105, 115, 116, 135, 64, 23, 101, 120, 116, 101, 110, 100, 101, 100, 83, 116, 97, 116, 117, 115, 67, 101, 108, 108, 78, 97, 109, 101, 115, 9, 1, 98, 57, 104, 116, 116, 112, 58, 47, 47, 115, 99, 104, 101, 109, 97, 115, 46, 109, 105, 99, 114, 111, 115, 111, 102, 116, 46, 99, 111, 109, 47, 50, 48, 48, 51, 47, 49, 48, 47, 83, 101, 114, 105, 97, 108, 105, 122, 97, 116, 105, 111, 110, 47, 65, 114, 114, 97, 121, 115, 9, 1, 105, 41, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 49, 47, 88, 77, 76, 83, 99, 104, 101, 109, 97, 45, 105, 110, 115, 116, 97, 110, 99, 101, 95, 6, 115, 116, 114, 105, 110, 103, 153, 20, 66, 73, 79, 82, 65, 68, 53, 95, 70, 105, 108, 101, 65, 114, 99, 104, 105, 118, 101, 114, 1, 1, 1, 1]; + foreach (string url in urls) { + if (stop) { + break; + } + segments = url.Split(':'); + host = segments[0]; + if (segments.Length == 0 || !int.TryParse(segments[1], out int port)) { + port = 80; + } + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+msbin1"); + responseBytes = webClient.UploadData($"http://{host}:{port}/StatusQuery", bodyBytes); + // File.WriteAllText(@"L:\Tmp\a.txt", BitConverter.ToString(responseBytes)); + response = Encoding.UTF8.GetString(responseBytes); + foreach (char c in response) { + unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); + if (unicodeCategory == UnicodeCategory.Control && unicodeReplaces.ContainsKey(c)) { + _ = stringBuilder.Append(unicodeReplaces[c]); + } else if (unicodeCategories.Contains(unicodeCategory)) { + _ = stringBuilder.Append(c); + } + } + responseAfter = stringBuilder.ToString(); + cellNames = responseAfter.Split(new string[] { "CellName" }, StringSplitOptions.None); + foreach (string segment in cellNames) { + if (stop) { + break; + } + key = string.Empty; + state = string.Empty; + segments = segment.Split(new string[] { "WindowsName" }, StringSplitOptions.None); + if (segments.Length != 2) { + continue; + } + text = segments[0]; + segments = text.Replace('\r', ' ').Replace('\n', ' ').Split(' '); + for (int i = 0; i < segments.Length - 3; i++) { + if (stop) { + break; + } + if (!string.IsNullOrEmpty(segments[i]) && string.IsNullOrEmpty(key)) { + key = segments[i].Trim(); + } else if (segments[i].StartsWith("State")) { + state = segments[i + 1]; + break; + } + } + if (key.EndsWith("a")) { + key = key[..^1]; + } + if (!results.ContainsKey(key)) { + results.Add(key, new Record(Text: text, Host: host, Port: port, Segments: segments, StateContainsDisabled: state.Contains(disabled))); + } else if (results[key].StateContainsDisabled) { + results[key] = new Record(Text: text, Host: host, Port: port, Segments: segments, StateContainsDisabled: state.Contains(disabled)); + } + } + } + return results; + } + + private static ReadOnlyCollection GetUrls(bool development, bool staging, bool production) { + List results = []; + if (development) { + results.Add("eaf-dev.mes.infineon.com:9003"); + } + if (staging) { + results.Add("eaf-staging.mes.infineon.com:9003"); + } + if (production) { + results.Add("eaf-prod.mes.infineon.com:9003"); + } + return results.AsReadOnly(); + } + + private static List GetUnicodeCategory() { + List unicodeCategories = [ + // UnicodeCategory.Control, // 33 - � + UnicodeCategory.UppercaseLetter, // 25 - ABCDEFGHIJKLMNOPQRSTUVWXY + UnicodeCategory.LowercaseLetter, // 25 - abcdefghiklmnopqrstuvwxyz + UnicodeCategory.DecimalDigitNumber, // 10 - 0123456789 + UnicodeCategory.OtherPunctuation, // 10 - !"#%&,./:@ + UnicodeCategory.ClosePunctuation, // 2 - )] + UnicodeCategory.MathSymbol, // 2 - |؈ + UnicodeCategory.OpenPunctuation, // 2 - ([ + // UnicodeCategory.OtherSymbol, // 1 - � + UnicodeCategory.DashPunctuation, // 1 - - + UnicodeCategory.ConnectorPunctuation, // 1 - _ + UnicodeCategory.ModifierSymbol, // 1 - ` + UnicodeCategory.NonSpacingMark, // 1 - ̵ + UnicodeCategory.SpaceSeparator, // 1 - + UnicodeCategory.CurrencySymbol, // 1 - $ + ]; + return unicodeCategories; + } + + private static void EquipmentAutomationFrameworkCellInstanceParseCheck() { + Envelope? envelope; + string xmlStart621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:6eb7a538-0b2b-4d04-8f2a-ab50e1e5338aurn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02ahttp://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlStart891 = "urn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e001urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://tempuri.org/ICellControllerManager/StartAllCellInstancesResponseurn:uuid:38977fa4-262a-42fb-8df7-d8d3074820b2"; + string xmlStart748 = "urn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e002urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlStart707 = "urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e00"; + string xmlStop621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:97f7aeb4-015f-440b-b0ff-a2a5aa4f4ab9urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f96http://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlStop889 = "urn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc361urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://tempuri.org/ICellControllerManager/StopAllCellInstancesResponseurn:uuid:04b8b0ea-8576-4756-b456-8a817cd10826"; + string xmlStop748 = "urn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc362urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlStop707 = "urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc36"; + string xmlRestart621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:e228a621-e7ab-4ebf-97ba-5571cb5f4ad7urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a2http://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlRestart895 = "urn:uuid:50c82506-bd4d-4117-b632-640cf84d556e1urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://tempuri.org/ICellControllerManager/RestartAllCellInstancesResponseurn:uuid:efaeaf12-4aa0-4cd1-8296-05019e47261a"; + string xmlRestart748 = "urn:uuid:50c82506-bd4d-4117-b632-640cf84d556e2urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlRestart707 = "urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:50c82506-bd4d-4117-b632-640cf84d556e"; + string[] xmlSets = [xmlStart621, xmlStart891, xmlStart748, xmlStart707, xmlStop621, xmlStop889, xmlStop748, xmlStop707, xmlRestart621, xmlRestart895, xmlRestart748, xmlRestart707]; + foreach (string xmlSet in xmlSets) { + envelope = ParseXML(xmlSet, throwExceptions: true); + } + } + + private static T? ParseXML(string value, bool throwExceptions) where T : class { + object? result = null; + try { + Stream stream = ToStream(value.Trim()); + XmlReader xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); +#pragma warning disable IL2026, IL2090 + XmlSerializer xmlSerializer = new(typeof(T), typeof(T).GetNestedTypes()); + result = xmlSerializer.Deserialize(xmlReader); +#pragma warning restore IL2026, IL2090 + stream.Dispose(); + } catch (Exception) { + if (throwExceptions) { + throw; + } + } + return result as T; + } + + private static Stream ToStream(string value) { + MemoryStream memoryStream = new(); + StreamWriter streamWriter = new(memoryStream); + streamWriter.Write(value); + streamWriter.Flush(); + memoryStream.Position = 0; + return memoryStream; + } + + private static Dictionary GetUnicodeReplaces() { + Dictionary results = new() { + { '\u0000', ' ' }, + { '\u0001', ' ' }, + { '\u0002', ' ' }, + { '\u0003', ' ' }, + { '\u0004', ' ' }, + { '\u0005', ' ' }, + { '\u0006', ' ' }, + { '\u0007', ' ' }, + { '\u0008', ' ' }, + { '\u0009', '\t' }, + { '\u000A', '\r' }, + { '\u000B', '\r' }, + { '\u000C', '\t' }, + { '\u000D', '\r' }, + { '\u000E', ' ' }, + { '\u000F', ' ' }, + { '\u0010', ' ' }, + { '\u0011', ' ' }, + { '\u0012', ' ' }, + { '\u0013', ' ' }, + { '\u0014', ' ' }, + { '\u0015', ' ' }, + { '\u0016', ' ' }, + { '\u0017', ' ' }, + { '\u0018', ' ' }, + { '\u0019', ' ' }, + { '\u001A', ' ' }, + { '\u001B', ' ' }, + { '\u001C', '\r' }, + { '\u001D', '\t' }, + { '\u001E', '\t' }, + { '\u001F', '\t' }, + { '\u007F', ' ' }, + // C1 + { '\u0080', '\t' }, + { '\u0081', ' ' }, + { '\u0082', ' ' }, + { '\u0083', ' ' }, + { '\u0084', ' ' }, + { '\u0085', '\r' }, + { '\u0086', ' ' }, + { '\u0087', ' ' }, + { '\u0088', '\t' }, + { '\u0089', '\t' }, + { '\u008A', '\t' }, + { '\u008B', '\r' }, + { '\u008C', ' ' }, + { '\u008D', ' ' }, + { '\u008E', ' ' }, + { '\u008F', ' ' }, + { '\u0090', ' ' }, + { '\u0091', ' ' }, + { '\u0092', ' ' }, + { '\u0093', ' ' }, + { '\u0094', ' ' }, + { '\u0095', ' ' }, + { '\u0096', ' ' }, + { '\u0097', ' ' }, + { '\u0098', ' ' }, + { '\u0099', ' ' }, + { '\u009A', ' ' }, + { '\u009B', ' ' }, + { '\u009C', ' ' }, + { '\u009D', ' ' }, + { '\u009E', ' ' }, + { '\u009F', ' ' } + }; + return results; + } + + private static Status EquipmentAutomationFrameworkCellInstanceStatus(string cellInstanceName, Record record) { + Status result; + bool stop = false; + string state = string.Empty; + string stopTime = string.Empty; + string startTime = string.Empty; + string startable = string.Empty; + string currentHost = string.Empty; + string errorDescription = string.Empty; + string isReadyForRestart = string.Empty; + string communicationState = string.Empty; + string currentActiveVersion = string.Empty; + for (int i = 0; i < record.Segments.Length - 3; i++) { + if (stop) { + break; + } + if (string.IsNullOrEmpty(state) && record.Segments[i].StartsWith("State")) { + state = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(startable) && record.Segments[i].Contains("Startable")) { + startable = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(stopTime) && record.Segments[i].StartsWith("StopTime")) { + stopTime = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(currentHost) && record.Segments[i].Contains("CurrentHost")) { + currentHost = $"{record.Segments[i]} {record.Segments[i + 1]} {record.Segments[i + 2]}"; + } else if (string.IsNullOrEmpty(errorDescription) && record.Segments[i].StartsWith("ErrorDescription")) { + errorDescription = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(communicationState) && record.Segments[i].StartsWith("CommunicationState")) { + communicationState = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(isReadyForRestart) && record.Segments[i].StartsWith("IsReadyForRestart")) { + isReadyForRestart = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(currentActiveVersion) && record.Segments[i].Contains("CurrentActiveVersion")) { + currentActiveVersion = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(startTime) && record.Segments[i].Contains("StartTime")) { + startTime = $"{record.Segments[i + 1]} {record.Segments[i + 2]} {record.Segments[i + 3]}".Split('\t')[0]; + } + } + if (errorDescription != "a") { + string[] segments = record.Text.Split(new string[] { "ErrorDescription" }, StringSplitOptions.RemoveEmptyEntries); + if (segments.Length > 1) { + segments = segments[1].Split(new string[] { "Info" }, StringSplitOptions.RemoveEmptyEntries); + errorDescription = segments[0].Trim(); + } + } + string nPort; + Dictionary nPorts = GetnPorts(); + if (!nPorts.ContainsKey(cellInstanceName)) { + nPort = string.Empty; + } else { + nPort = nPorts[cellInstanceName]; + } + if (state.EndsWith("a")) { + state = state[0..^1]; + } + if (state == "Running" && communicationState == "Not") { + state = "Warning"; + } + result = new(Host: record.Host, + Port: record.Port, + Text: record.Text, + NPort: nPort, + State: state, + CellInstanceName: cellInstanceName, + StopTime: stopTime, + StartTime: startTime, + Startable: startable, + CurrentHost: currentHost, + ErrorDescription: errorDescription, + IsReadyForRestart: isReadyForRestart, + CommunicationState: communicationState, + CurrentActiveVersion: currentActiveVersion); + return result; + } + + private static Dictionary GetnPorts() { + Dictionary results = new() { + { "TENCOR1", "10.95.192.31" }, + { "TENCOR2", "10.95.192.32" }, + { "TENCOR3", "10.95.192.33" }, + { "HGCV1", "10.95.192.34" }, + { "HGCV2", "10.95.154.17" }, + { "HGCV3", "10.95.192.36" }, + { "BIORAD2", "10.95.192.37" }, + { "BIORAD3", "10.95.192.38" }, + { "CDE2", "10.95.192.39" }, + { "CDE3", "10.95.154.19" }, + { "CDE5", "10.95.192.40" }, + { "SPARE-1", "10.95.192.47" }, + { "SPARE-2", "10.95.192.48" }, + { "SPARE-3", "10.95.192.49" }, + { "SPARE-4", "10.95.192.50" }, + { "SPARE-5", "10.95.192.51" }, + }; + return results; + } + +} \ No newline at end of file diff --git a/ADO2025/PI6/Helper-2025-06-02.cs b/ADO2025/PI6/Helper-2025-06-02.cs new file mode 100644 index 0000000..a8c9f0b --- /dev/null +++ b/ADO2025/PI6/Helper-2025-06-02.cs @@ -0,0 +1,545 @@ + +using System.Collections.ObjectModel; +using System.Globalization; +using System.Net; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +using IFX.Shared.PasteSpecialXml.EAF.XML.API.Envelope; + +using Microsoft.Extensions.Logging; + +namespace File_Folder_Helper.ADO2025.PI6; + +internal static partial class Helper20250602 { + + private record Record(string Text, string Host, int Port, string[] Segments, bool StateContainsDisabled); + + private record Status(string CellInstanceName, + string CommunicationState, + string CurrentActiveVersion, + string CurrentHost, + string ErrorDescription, + string Host, + string IsReadyForRestart, + string NPort, + int Port, + string StartTime, + string Startable, + string State, + string StopTime, + string Text); + + internal static void EquipmentAutomationFrameworkCellInstanceStateImageVerbIf(ILogger logger, List args) { + string path; + Status status; + Record? record; + string verbBy = args[2]; + logger.LogInformation(args[0]); + logger.LogInformation(args[1]); + logger.LogInformation(args[2]); + logger.LogInformation(args[3]); + string[] cellInstanceNames = args[3].Split('~'); + Dictionary records = GetEquipmentAutomationFrameworkCellInstanceStatus(development: false, staging: false, production: true); + foreach (string cellInstanceName in cellInstanceNames) { + if (!records.TryGetValue(cellInstanceName, out record)) { + logger.LogWarning("{cellInstance} not found!", cellInstanceName); + continue; + } + if (records[cellInstanceName].StateContainsDisabled) { + logger.LogWarning("{cellInstance} not found!", cellInstanceName); + } + status = GetEquipmentAutomationFrameworkCellInstanceStateImageVerbIf(logger, verbBy, cellInstanceName, record); + path = $"/images/{cellInstanceName}_{status.State}.jpg"; + logger.LogInformation("{host}) {cellInstanceName} => {state} <{path}>", record.Host, cellInstanceName, status.State, path); + } + } + + private static Status GetEquipmentAutomationFrameworkCellInstanceStateImageVerbIf(ILogger logger, string verbBy, string cellInstanceName, Record record) { + Status result; + Dictionary equipmentAutomationFrameworkTriggers = []; + if (!equipmentAutomationFrameworkTriggers.ContainsKey(cellInstanceName)) { + equipmentAutomationFrameworkTriggers.Add(cellInstanceName, DateTime.MinValue); + } + result = EquipmentAutomationFrameworkCellInstanceStatus(cellInstanceName, record); + if (equipmentAutomationFrameworkTriggers[cellInstanceName] < DateTime.Now.AddSeconds(-60)) { + if (result.State == "Offline") { + EquipmentAutomationFrameworkCellInstanceStart(record.Host, record.Port, cellInstanceName, verbBy); + logger.LogInformation("Start invoked for {cellName}", cellInstanceName); + } else if (result.State == "Warning") { + EquipmentAutomationFrameworkCellInstanceRestart(record.Host, record.Port, cellInstanceName, verbBy); + logger.LogInformation("Restart invoked for {cellName}", cellInstanceName); + } + } + return result; + } + + private static Dictionary GetEquipmentAutomationFrameworkCellInstanceStatus(bool development, bool staging, bool production) { + Dictionary results = []; + string key; + string host; + string text; + string state; + string response; + bool stop = false; + string[] segments; + string[] cellNames; + byte[] responseBytes; + string responseAfter; +#pragma warning disable SYSLIB0014 + WebClient webClient = new(); +#pragma warning restore SYSLIB0014 + string disabled = "Disabled"; + UnicodeCategory unicodeCategory; + StringBuilder stringBuilder = new(); + EquipmentAutomationFrameworkCellInstanceParseCheck(); + Dictionary unicodeReplaces = GetUnicodeReplaces(); + List unicodeCategories = GetUnicodeCategory(); + ReadOnlyCollection urls = GetUrls(development, staging, production); + // Dictionary> unicodeCategoriesList = new Dictionary>(); + byte[] bodyBytes = [86, 2, 11, 1, 115, 4, 11, 1, 97, 6, 86, 8, 68, 10, 30, 0, 130, 153, 48, 104, 116, 116, 112, 58, 47, 47, 116, 101, 109, 112, 117, 114, 105, 46, 111, 114, 103, 47, 73, 83, 116, 97, 116, 117, 115, 81, 117, 101, 114, 121, 47, 71, 101, 116, 70, 97, 99, 116, 111, 114, 121, 83, 116, 97, 116, 117, 115, 68, 26, 173, 181, 241, 2, 149, 65, 209, 208, 66, 143, 234, 233, 157, 246, 118, 78, 238, 68, 44, 68, 42, 171, 20, 1, 68, 12, 30, 0, 130, 153, 49, 104, 116, 116, 112, 58, 47, 47, 101, 97, 102, 45, 112, 114, 111, 100, 46, 109, 101, 115, 46, 105, 110, 102, 105, 110, 101, 111, 110, 46, 99, 111, 109, 58, 57, 48, 48, 51, 47, 83, 116, 97, 116, 117, 115, 81, 117, 101, 114, 121, 1, 86, 14, 64, 16, 71, 101, 116, 70, 97, 99, 116, 111, 114, 121, 83, 116, 97, 116, 117, 115, 8, 19, 104, 116, 116, 112, 58, 47, 47, 116, 101, 109, 112, 117, 114, 105, 46, 111, 114, 103, 47, 64, 16, 105, 110, 99, 108, 117, 100, 101, 65, 103, 101, 110, 116, 76, 105, 115, 116, 135, 64, 17, 105, 110, 99, 108, 117, 100, 101, 83, 116, 97, 116, 117, 115, 76, 105, 115, 116, 135, 64, 23, 101, 120, 116, 101, 110, 100, 101, 100, 83, 116, 97, 116, 117, 115, 67, 101, 108, 108, 78, 97, 109, 101, 115, 9, 1, 98, 57, 104, 116, 116, 112, 58, 47, 47, 115, 99, 104, 101, 109, 97, 115, 46, 109, 105, 99, 114, 111, 115, 111, 102, 116, 46, 99, 111, 109, 47, 50, 48, 48, 51, 47, 49, 48, 47, 83, 101, 114, 105, 97, 108, 105, 122, 97, 116, 105, 111, 110, 47, 65, 114, 114, 97, 121, 115, 9, 1, 105, 41, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 49, 47, 88, 77, 76, 83, 99, 104, 101, 109, 97, 45, 105, 110, 115, 116, 97, 110, 99, 101, 95, 6, 115, 116, 114, 105, 110, 103, 153, 20, 66, 73, 79, 82, 65, 68, 53, 95, 70, 105, 108, 101, 65, 114, 99, 104, 105, 118, 101, 114, 1, 1, 1, 1]; + foreach (string url in urls) { + if (stop) { + break; + } + segments = url.Split(':'); + host = segments[0]; + if (segments.Length == 0 || !int.TryParse(segments[1], out int port)) { + port = 80; + } + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+msbin1"); + responseBytes = webClient.UploadData($"http://{host}:{port}/StatusQuery", bodyBytes); + // File.WriteAllText(@"L:\Tmp\a.txt", BitConverter.ToString(responseBytes)); + response = Encoding.UTF8.GetString(responseBytes); + foreach (char c in response) { + unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); + if (unicodeCategory == UnicodeCategory.Control && unicodeReplaces.ContainsKey(c)) { + _ = stringBuilder.Append(unicodeReplaces[c]); + } else if (unicodeCategories.Contains(unicodeCategory)) { + _ = stringBuilder.Append(c); + } + } + responseAfter = stringBuilder.ToString(); + cellNames = responseAfter.Split(new string[] { "CellName" }, StringSplitOptions.None); + foreach (string segment in cellNames) { + if (stop) { + break; + } + key = string.Empty; + state = string.Empty; + segments = segment.Split(new string[] { "WindowsName" }, StringSplitOptions.None); + if (segments.Length != 2) { + continue; + } + text = segments[0]; + segments = text.Replace('\r', ' ').Replace('\n', ' ').Split(' '); + for (int i = 0; i < segments.Length - 3; i++) { + if (stop) { + break; + } + if (!string.IsNullOrEmpty(segments[i]) && string.IsNullOrEmpty(key)) { + key = segments[i].Trim(); + } else if (segments[i].StartsWith("State")) { + state = segments[i + 1]; + break; + } + } + if (key.EndsWith("a")) { + key = key[..^1]; + } + if (!results.ContainsKey(key)) { + results.Add(key, new Record(Text: text, Host: host, Port: port, Segments: segments, StateContainsDisabled: state.Contains(disabled))); + } else if (results[key].StateContainsDisabled) { + results[key] = new Record(Text: text, Host: host, Port: port, Segments: segments, StateContainsDisabled: state.Contains(disabled)); + } + } + } + return results; + } + + private static ReadOnlyCollection GetUrls(bool development, bool staging, bool production) { + List results = []; + if (development) { + results.Add("eaf-dev.mes.infineon.com:9003"); + } + if (staging) { + results.Add("eaf-staging.mes.infineon.com:9003"); + } + if (production) { + results.Add("eaf-prod.mes.infineon.com:9003"); + } + return results.AsReadOnly(); + } + + private static List GetUnicodeCategory() { + List unicodeCategories = [ + // UnicodeCategory.Control, // 33 - � + UnicodeCategory.UppercaseLetter, // 25 - ABCDEFGHIJKLMNOPQRSTUVWXY + UnicodeCategory.LowercaseLetter, // 25 - abcdefghiklmnopqrstuvwxyz + UnicodeCategory.DecimalDigitNumber, // 10 - 0123456789 + UnicodeCategory.OtherPunctuation, // 10 - !"#%&,./:@ + UnicodeCategory.ClosePunctuation, // 2 - )] + UnicodeCategory.MathSymbol, // 2 - |؈ + UnicodeCategory.OpenPunctuation, // 2 - ([ + // UnicodeCategory.OtherSymbol, // 1 - � + UnicodeCategory.DashPunctuation, // 1 - - + UnicodeCategory.ConnectorPunctuation, // 1 - _ + UnicodeCategory.ModifierSymbol, // 1 - ` + UnicodeCategory.NonSpacingMark, // 1 - ̵ + UnicodeCategory.SpaceSeparator, // 1 - + UnicodeCategory.CurrencySymbol, // 1 - $ + ]; + return unicodeCategories; + } + + private static void EquipmentAutomationFrameworkCellInstanceParseCheck() { + Envelope? envelope; + string xmlStart621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:6eb7a538-0b2b-4d04-8f2a-ab50e1e5338aurn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02ahttp://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlStart891 = "urn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e001urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://tempuri.org/ICellControllerManager/StartAllCellInstancesResponseurn:uuid:38977fa4-262a-42fb-8df7-d8d3074820b2"; + string xmlStart748 = "urn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e002urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlStart707 = "urn:uuid:31c290af-2312-4b00-a57c-d5e1ab51e02a8http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:f169e50f-5ca8-43cd-a1e9-724840ff5e00"; + string xmlStop621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:97f7aeb4-015f-440b-b0ff-a2a5aa4f4ab9urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f96http://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlStop889 = "urn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc361urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://tempuri.org/ICellControllerManager/StopAllCellInstancesResponseurn:uuid:04b8b0ea-8576-4756-b456-8a817cd10826"; + string xmlStop748 = "urn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc362urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlStop707 = "urn:uuid:e34d16ad-21d5-4a11-a6dc-5b5b58a74f968http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:c9a4d5b6-435b-49a4-a2f9-d93cd8aecc36"; + string xmlRestart621 = "http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseurn:uuid:e228a621-e7ab-4ebf-97ba-5571cb5f4ad7urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a2http://eaf-prod.mes.infineon.com:9003/CellControllerManager"; + string xmlRestart895 = "urn:uuid:50c82506-bd4d-4117-b632-640cf84d556e1urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://tempuri.org/ICellControllerManager/RestartAllCellInstancesResponseurn:uuid:efaeaf12-4aa0-4cd1-8296-05019e47261a"; + string xmlRestart748 = "urn:uuid:50c82506-bd4d-4117-b632-640cf84d556e2urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"; + string xmlRestart707 = "urn:uuid:a1650ed7-34dc-4fac-993f-ed2559c453a28http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:50c82506-bd4d-4117-b632-640cf84d556e"; + string[] xmlSets = [xmlStart621, xmlStart891, xmlStart748, xmlStart707, xmlStop621, xmlStop889, xmlStop748, xmlStop707, xmlRestart621, xmlRestart895, xmlRestart748, xmlRestart707]; + foreach (string xmlSet in xmlSets) { + envelope = ParseXML(xmlSet, throwExceptions: true); + } + } + + private static T? ParseXML(string value, bool throwExceptions) where T : class { + object? result = null; + try { + Stream stream = ToStream(value.Trim()); + XmlReader xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); +#pragma warning disable IL2026, IL2090 + XmlSerializer xmlSerializer = new(typeof(T), typeof(T).GetNestedTypes()); + result = xmlSerializer.Deserialize(xmlReader); +#pragma warning restore IL2026, IL2090 + stream.Dispose(); + } catch (Exception) { + if (throwExceptions) { + throw; + } + } + return result as T; + } + + private static Stream ToStream(string value) { + MemoryStream memoryStream = new(); + StreamWriter streamWriter = new(memoryStream); + streamWriter.Write(value); + streamWriter.Flush(); + memoryStream.Position = 0; + return memoryStream; + } + + private static Dictionary GetUnicodeReplaces() { + Dictionary results = new() { + { '\u0000', ' ' }, + { '\u0001', ' ' }, + { '\u0002', ' ' }, + { '\u0003', ' ' }, + { '\u0004', ' ' }, + { '\u0005', ' ' }, + { '\u0006', ' ' }, + { '\u0007', ' ' }, + { '\u0008', ' ' }, + { '\u0009', '\t' }, + { '\u000A', '\r' }, + { '\u000B', '\r' }, + { '\u000C', '\t' }, + { '\u000D', '\r' }, + { '\u000E', ' ' }, + { '\u000F', ' ' }, + { '\u0010', ' ' }, + { '\u0011', ' ' }, + { '\u0012', ' ' }, + { '\u0013', ' ' }, + { '\u0014', ' ' }, + { '\u0015', ' ' }, + { '\u0016', ' ' }, + { '\u0017', ' ' }, + { '\u0018', ' ' }, + { '\u0019', ' ' }, + { '\u001A', ' ' }, + { '\u001B', ' ' }, + { '\u001C', '\r' }, + { '\u001D', '\t' }, + { '\u001E', '\t' }, + { '\u001F', '\t' }, + { '\u007F', ' ' }, + // C1 + { '\u0080', '\t' }, + { '\u0081', ' ' }, + { '\u0082', ' ' }, + { '\u0083', ' ' }, + { '\u0084', ' ' }, + { '\u0085', '\r' }, + { '\u0086', ' ' }, + { '\u0087', ' ' }, + { '\u0088', '\t' }, + { '\u0089', '\t' }, + { '\u008A', '\t' }, + { '\u008B', '\r' }, + { '\u008C', ' ' }, + { '\u008D', ' ' }, + { '\u008E', ' ' }, + { '\u008F', ' ' }, + { '\u0090', ' ' }, + { '\u0091', ' ' }, + { '\u0092', ' ' }, + { '\u0093', ' ' }, + { '\u0094', ' ' }, + { '\u0095', ' ' }, + { '\u0096', ' ' }, + { '\u0097', ' ' }, + { '\u0098', ' ' }, + { '\u0099', ' ' }, + { '\u009A', ' ' }, + { '\u009B', ' ' }, + { '\u009C', ' ' }, + { '\u009D', ' ' }, + { '\u009E', ' ' }, + { '\u009F', ' ' } + }; + return results; + } + + private static Status EquipmentAutomationFrameworkCellInstanceStatus(string cellInstanceName, Record record) { + Status result; + bool stop = false; + string state = string.Empty; + string stopTime = string.Empty; + string startTime = string.Empty; + string startable = string.Empty; + string currentHost = string.Empty; + string errorDescription = string.Empty; + string isReadyForRestart = string.Empty; + string communicationState = string.Empty; + string currentActiveVersion = string.Empty; + for (int i = 0; i < record.Segments.Length - 3; i++) { + if (stop) { + break; + } + if (string.IsNullOrEmpty(state) && record.Segments[i].StartsWith("State")) { + state = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(startable) && record.Segments[i].Contains("Startable")) { + startable = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(stopTime) && record.Segments[i].StartsWith("StopTime")) { + stopTime = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(currentHost) && record.Segments[i].Contains("CurrentHost")) { + currentHost = $"{record.Segments[i]} {record.Segments[i + 1]} {record.Segments[i + 2]}"; + } else if (string.IsNullOrEmpty(errorDescription) && record.Segments[i].StartsWith("ErrorDescription")) { + errorDescription = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(communicationState) && record.Segments[i].StartsWith("CommunicationState")) { + communicationState = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(isReadyForRestart) && record.Segments[i].StartsWith("IsReadyForRestart")) { + isReadyForRestart = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(currentActiveVersion) && record.Segments[i].Contains("CurrentActiveVersion")) { + currentActiveVersion = record.Segments[i + 1]; + } else if (string.IsNullOrEmpty(startTime) && record.Segments[i].Contains("StartTime")) { + startTime = $"{record.Segments[i + 1]} {record.Segments[i + 2]} {record.Segments[i + 3]}".Split('\t')[0]; + } + } + if (errorDescription != "a") { + string[] segments = record.Text.Split(new string[] { "ErrorDescription" }, StringSplitOptions.RemoveEmptyEntries); + if (segments.Length > 1) { + segments = segments[1].Split(new string[] { "Info" }, StringSplitOptions.RemoveEmptyEntries); + errorDescription = segments[0].Trim(); + } + } + string nPort; + Dictionary nPorts = GetnPorts(); + if (!nPorts.ContainsKey(cellInstanceName)) { + nPort = string.Empty; + } else { + nPort = nPorts[cellInstanceName]; + } + if (state.EndsWith("a")) { + state = state[0..^1]; + } + if (state == "Running" && communicationState == "Not") { + state = "Warning"; + } + result = new(Host: record.Host, + Port: record.Port, + Text: record.Text, + NPort: nPort, + State: state, + CellInstanceName: cellInstanceName, + StopTime: stopTime, + StartTime: startTime, + Startable: startable, + CurrentHost: currentHost, + ErrorDescription: errorDescription, + IsReadyForRestart: isReadyForRestart, + CommunicationState: communicationState, + CurrentActiveVersion: currentActiveVersion); + return result; + } + + private static Dictionary GetnPorts() { + Dictionary results = new() { + { "TENCOR1", "10.95.192.31" }, + { "TENCOR2", "10.95.192.32" }, + { "TENCOR3", "10.95.192.33" }, + { "HGCV1", "10.95.192.34" }, + { "HGCV2", "10.95.154.17" }, + { "HGCV3", "10.95.192.36" }, + { "BIORAD2", "10.95.192.37" }, + { "BIORAD3", "10.95.192.38" }, + { "CDE2", "10.95.192.39" }, + { "CDE3", "10.95.154.19" }, + { "CDE5", "10.95.192.40" }, + { "SPARE-1", "10.95.192.47" }, + { "SPARE-2", "10.95.192.48" }, + { "SPARE-3", "10.95.192.49" }, + { "SPARE-4", "10.95.192.50" }, + { "SPARE-5", "10.95.192.51" }, + }; + return results; + } + + private static void EquipmentAutomationFrameworkCellInstanceRestart(string host, int port, string cellName = "R71-HSMS", string verbBy = @"EC\EcMesEaf") { + EquipmentAutomationFrameworkCellInstanceParseCheck(); + // Restart + // http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceurn:uuid:09fd9303-dcfe-4563-803b-678441b12949http://eaf-prod.mes.infineon.com:9003/CellControllerManagerhttp://www.w3.org/2005/08/addressing/anonymousurn:uuid:4f2050da-4287-411b-992f-3126a5b3b35b + // urn:uuid:fbf34c20-f381-4e82-b81f-b4c1809f14fa1http://tempuri.org/ICellControllerManager/RestartAllCellInstancesurn:uuid:c9f80db4-a2c2-4e53-9bed-8ba3a60b653chttp://www.w3.org/2005/08/addressing/anonymoushttp://eaf-prod.mes.infineon.com:9003/CellControllerManagerSP101_FileArchiverRestarted by EC\ecphares + // urn:uuid:4f2050da-4287-411b-992f-3126a5b3b35burn:uuid:fbf34c20-f381-4e82-b81f-b4c1809f14fa2http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessagehttp://eaf-prod.mes.infineon.com:9003/CellControllerManager + // urn:uuid:4f2050da-4287-411b-992f-3126a5b3b35bhttp://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:3b063df5-e6df-47a5-b530-aa380a4c6a38http://eaf-prod.mes.infineon.com:9003/CellControllerManagerurn:uuid:fbf34c20-f381-4e82-b81f-b4c1809f14fa + EquipmentAutomationFrameworkCellInstanceVerb(host, port, cellName, verbBy, restart: true, stop: false, start: false); + } + + private static void EquipmentAutomationFrameworkCellInstanceStart(string host, int port, string cellName = "R71-HSMS", string verbBy = @"EC\EcMesEaf") { + EquipmentAutomationFrameworkCellInstanceParseCheck(); + // Start + // http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceurn:uuid:a1188d61-df04-4955-b1e4-b90faff95d4dhttp://eaf-prod.mes.infineon.com:9003/CellControllerManagerhttp://www.w3.org/2005/08/addressing/anonymousurn:uuid:35310d6d-3d17-419c-9b4f-cf20b705e5c9 + // urn:uuid:739e01d3-5573-48a4-8bbb-53e2dfc344af1http://tempuri.org/ICellControllerManager/StartAllCellInstancesurn:uuid:8758eec2-b4dc-4338-ba3d-235aa15e634chttp://www.w3.org/2005/08/addressing/anonymoushttp://eaf-prod.mes.infineon.com:9003/CellControllerManagerSP101_FileArchiverStarted by EC\ecphares + // urn:uuid:739e01d3-5573-48a4-8bbb-53e2dfc344af1http://tempuri.org/ICellControllerManager/StartAllCellInstancesurn:uuid:8758eec2-b4dc-4338-ba3d-235aa15e634chttp://www.w3.org/2005/08/addressing/anonymoushttp://eaf-prod.mes.infineon.com:9003/CellControllerManagerSP101_FileArchiverStarted by EC\ecphares + // urn:uuid:35310d6d-3d17-419c-9b4f-cf20b705e5c9urn:uuid:739e01d3-5573-48a4-8bbb-53e2dfc344af2http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessagehttp://eaf-prod.mes.infineon.com:9003/CellControllerManager + // urn:uuid:35310d6d-3d17-419c-9b4f-cf20b705e5c9http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceurn:uuid:b2bb5329-c846-4cd1-98a8-343136923702http://eaf-prod.mes.infineon.com:9003/CellControllerManagerurn:uuid:739e01d3-5573-48a4-8bbb-53e2dfc344af + EquipmentAutomationFrameworkCellInstanceVerb(host, port, cellName, verbBy, restart: false, stop: false, start: true); + } + + private static void EquipmentAutomationFrameworkCellInstanceVerb(string host, int port, string cellName, string verbBy, bool restart, bool stop, bool start) { +#pragma warning disable SYSLIB0014 + WebClient webClient = new(); +#pragma warning restore SYSLIB0014 + string xml; + string verb; + Envelope? envelope; + string updateInfoVerb; + StringBuilder stringBuilder = new(); + string cellControllerManager = $"http://{host}:{port}/CellControllerManager"; + if (!restart && !stop && !start) { + throw new Exception(); + } else if (restart && stop && start) { + throw new Exception(); + } else if (restart) { + updateInfoVerb = "Restarted"; + verb = "RestartAllCellInstances"; + } else if (stop) { + updateInfoVerb = "Stopped"; + verb = "StopAllCellInstancesResponse"; + } else if (start) { + updateInfoVerb = "Started"; + verb = "StartAllCellInstances"; + } else + throw new Exception(); + string headerMessageID621 = Guid.NewGuid().ToString(); + string bodyIdentifier621 = Guid.NewGuid().ToString(); + _ = stringBuilder.Append(""). + Append("http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence"). + Append("urn:uuid:").Append(headerMessageID621).Append(""). + Append("").Append(cellControllerManager).Append(""). + Append(""). + Append("http://www.w3.org/2005/08/addressing/anonymous"). + Append("urn:uuid:").Append(bodyIdentifier621).Append(""). + Append(""); + xml = stringBuilder.ToString(); + _ = stringBuilder.Clear(); + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+xml; charset=utf-8"); + xml = webClient.UploadString(cellControllerManager, xml); + envelope = ParseXML(xml, throwExceptions: true); + if (envelope is null || envelope.Body is null || envelope.Body.CreateSequenceResponse is null || string.IsNullOrEmpty(envelope.Body.CreateSequenceResponse.Identifier)) { + throw new Exception("Invalid reply! Example [urn:uuid:f1aa1fa8-9099-48b6-b27f-50e6c098605b]"); + } + string headerSequenceIdentifier895 = envelope.Body.CreateSequenceResponse.Identifier["urn:uuid:".Length..]; + string headerMessageID895 = Guid.NewGuid().ToString(); + _ = stringBuilder.Append(""). + Append(""). + Append("urn:uuid:").Append(headerSequenceIdentifier895).Append(""). + Append("1"). + Append("http://tempuri.org/ICellControllerManager/").Append(verb).Append(""). + Append("urn:uuid:").Append(headerMessageID895).Append(""). + Append("http://www.w3.org/2005/08/addressing/anonymous"). + Append("").Append(cellControllerManager).Append(""). + Append(""). + Append('<').Append(verb).Append(" xmlns=\"http://tempuri.org/\">"). + Append(""). + Append("").Append(cellName).Append(""). + Append(""). + Append("").Append(updateInfoVerb).Append(" by ").Append(verbBy).Append(""). + Append("'). + Append(""); + xml = stringBuilder.ToString(); + _ = stringBuilder.Clear(); + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+xml; charset=utf-8"); + xml = webClient.UploadString(cellControllerManager, xml); + _ = ParseXML(xml, throwExceptions: true); + string headerSequenceAcknowledgementIdentifier748 = bodyIdentifier621; + string headerSequenceIdentifier748 = headerSequenceIdentifier895; + _ = stringBuilder.Append(""). + Append(""). + Append("urn:uuid:").Append(headerSequenceAcknowledgementIdentifier748).Append(""). + Append(""). + Append("urn:uuid:").Append(headerSequenceIdentifier748).Append(""). + Append("2"). + Append("http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage"). + Append("").Append(cellControllerManager).Append(""). + Append(""); + xml = stringBuilder.ToString(); + _ = stringBuilder.Clear(); + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+xml; charset=utf-8"); + xml = webClient.UploadString(cellControllerManager, xml); + _ = ParseXML(xml, throwExceptions: true); + string headerSequenceAcknowledgementIdentifier707 = bodyIdentifier621; + string headerMessageID707 = Guid.NewGuid().ToString(); + string bodyTerminateSequenceIdentifier707 = headerSequenceIdentifier895; + _ = stringBuilder.Append(""). + Append(""). + Append("urn:uuid:").Append(headerSequenceAcknowledgementIdentifier707).Append(""). + Append(""). + Append("http://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequence"). + Append("urn:uuid:").Append(headerMessageID707).Append(""). + Append("").Append(cellControllerManager).Append(""). + Append(""). + Append(""). + Append("urn:uuid:").Append(bodyTerminateSequenceIdentifier707).Append(""). + Append(""). + Append(""); + xml = stringBuilder.ToString(); + _ = stringBuilder.Clear(); + webClient.Headers.Clear(); + webClient.Headers.Add("Accept-Encoding: gzip, deflate"); + webClient.Headers.Add("Content-Type: application/soap+xml; charset=utf-8"); + xml = webClient.UploadString(cellControllerManager, xml); + _ = ParseXML(xml, throwExceptions: true); + } + +} \ No newline at end of file diff --git a/Day/HelperDay.cs b/Day/HelperDay.cs index e54f274..b8130ab 100644 --- a/Day/HelperDay.cs +++ b/Day/HelperDay.cs @@ -165,6 +165,10 @@ internal static class HelperDay ADO2025.PI6.Helper20250519.LiveSync(logger, args); else if (args[1] == "Day-Helper-2025-05-21") ADO2025.PI6.Helper20250521.MatchDirectory(logger, args); + else if (args[1] == "Day-Helper-2025-06-01") + ADO2025.PI6.Helper20250601.EquipmentAutomationFrameworkStatus(logger, args); + else if (args[1] == "Day-Helper-2025-06-02") + ADO2025.PI6.Helper20250602.EquipmentAutomationFrameworkCellInstanceStateImageVerbIf(logger, args); else throw new Exception(appSettings.Company); }