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(verb).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);
}