Compare commits
	
		
			5 Commits
		
	
	
		
			20250203_S
			...
			29a0c365c5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 29a0c365c5 | |||
| 1ffb8e0785 | |||
| 05390839fc | |||
| 4f59f1ab2f | |||
| c3e6aad895 | 
| @@ -16,7 +16,7 @@ | |||||||
|     <TargetFrameworkProfile /> |     <TargetFrameworkProfile /> | ||||||
|     <NuGetPackageImportStamp> |     <NuGetPackageImportStamp> | ||||||
|     </NuGetPackageImportStamp> |     </NuGetPackageImportStamp> | ||||||
|     <PublishUrl>ftp://192.168.100.11/eqview/Provider/</PublishUrl> |     <PublishUrl>ftp://pms.e1soft.co.kr/eqview/Provider/</PublishUrl> | ||||||
|     <Install>true</Install> |     <Install>true</Install> | ||||||
|     <InstallFrom>Web</InstallFrom> |     <InstallFrom>Web</InstallFrom> | ||||||
|     <UpdateEnabled>true</UpdateEnabled> |     <UpdateEnabled>true</UpdateEnabled> | ||||||
| @@ -35,7 +35,7 @@ | |||||||
|     <WebPage>index.htm</WebPage> |     <WebPage>index.htm</WebPage> | ||||||
|     <TrustUrlParameters>true</TrustUrlParameters> |     <TrustUrlParameters>true</TrustUrlParameters> | ||||||
|     <ApplicationRevision>0</ApplicationRevision> |     <ApplicationRevision>0</ApplicationRevision> | ||||||
|     <ApplicationVersion>2025.01.07.0</ApplicationVersion> |     <ApplicationVersion>2025.03.18.0</ApplicationVersion> | ||||||
|     <UseApplicationTrust>false</UseApplicationTrust> |     <UseApplicationTrust>false</UseApplicationTrust> | ||||||
|     <CreateDesktopShortcut>true</CreateDesktopShortcut> |     <CreateDesktopShortcut>true</CreateDesktopShortcut> | ||||||
|     <PublishWizardCompleted>true</PublishWizardCompleted> |     <PublishWizardCompleted>true</PublishWizardCompleted> | ||||||
| @@ -404,6 +404,12 @@ | |||||||
|     <Compile Include="LOGPARSER\FrmEqSelector.Designer.cs"> |     <Compile Include="LOGPARSER\FrmEqSelector.Designer.cs"> | ||||||
|       <DependentUpon>FrmEqSelector.cs</DependentUpon> |       <DependentUpon>FrmEqSelector.cs</DependentUpon> | ||||||
|     </Compile> |     </Compile> | ||||||
|  |     <Compile Include="MESDOWNLOADER\FrmServerLog.cs"> | ||||||
|  |       <SubType>Form</SubType> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="MESDOWNLOADER\FrmServerLog.Designer.cs"> | ||||||
|  |       <DependentUpon>FrmServerLog.cs</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|     <Compile Include="MESDOWNLOADER\ProgressForm.cs"> |     <Compile Include="MESDOWNLOADER\ProgressForm.cs"> | ||||||
|       <SubType>Form</SubType> |       <SubType>Form</SubType> | ||||||
|     </Compile> |     </Compile> | ||||||
| @@ -522,6 +528,9 @@ | |||||||
|     <EmbeddedResource Include="LOGPARSER\FrmWorkFlow.resx"> |     <EmbeddedResource Include="LOGPARSER\FrmWorkFlow.resx"> | ||||||
|       <DependentUpon>FrmWorkFlow.cs</DependentUpon> |       <DependentUpon>FrmWorkFlow.cs</DependentUpon> | ||||||
|     </EmbeddedResource> |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="MESDOWNLOADER\FrmServerLog.resx"> | ||||||
|  |       <DependentUpon>FrmServerLog.cs</DependentUpon> | ||||||
|  |     </EmbeddedResource> | ||||||
|     <EmbeddedResource Include="MONGO\FrmFDCMongo.resx"> |     <EmbeddedResource Include="MONGO\FrmFDCMongo.resx"> | ||||||
|       <DependentUpon>FrmFDCMongo.cs</DependentUpon> |       <DependentUpon>FrmFDCMongo.cs</DependentUpon> | ||||||
|     </EmbeddedResource> |     </EmbeddedResource> | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ namespace DDUtilityApp | |||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// 로그파일 다운로드 경로 jhlim 20250202 |         /// 로그파일 다운로드 경로 jhlim 20250202 | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public string MesDownloadPath { get; set; } |         public string DownloadPathServerLog { get; set; } | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Workflow 다운로드 경로 |         /// Workflow 다운로드 경로 | ||||||
| @@ -106,22 +106,32 @@ namespace DDUtilityApp | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Loading AppSettings | ||||||
|  |         /// </summary> | ||||||
|         private void LodConfig() |         private void LodConfig() | ||||||
|         { |         { | ||||||
|             // DefaultPath |             // DefaultPath | ||||||
|             string defaultPath = ConfigurationManager.AppSettings["DefaultPath"]; |             string defaultPath = ConfigurationManager.AppSettings["DefaultPath"]; | ||||||
|             if (string.IsNullOrEmpty(defaultPath)) defaultPath = $@"%MyDocuments%\DDUtility\"; |             if (string.IsNullOrEmpty(defaultPath)) defaultPath = $@"%MyDocuments%\DDUtility\"; | ||||||
|             this.DefaultPath = defaultPath.Replace("%MyDocuments%", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); |             this.DefaultPath = defaultPath.Replace("%MyDocuments%", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); | ||||||
|             this.DownloadPath = $@"{this.DefaultPath}Download\"; |             this.DownloadPath = Path.Combine(this.DefaultPath, "Download"); | ||||||
|             this.WorkflowPath = $@"{this.DefaultPath}Workflow\"; |             this.WorkflowPath = Path.Combine(this.DefaultPath, "Workflow"); | ||||||
|             this.MesDownloadPath = $@"{this.DefaultPath}MesDownload\";   //jhlim 20250202 |             this.DownloadPathServerLog = Path.Combine(this.DefaultPath, "DownloadServer"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Loading Setting.xml | ||||||
|  |         /// </summary> | ||||||
|         public void LoadSetting() |         public void LoadSetting() | ||||||
|         { |         { | ||||||
|             this.LoadSetting($@"{this.DefaultPath}Setting.xml"); |             this.LoadSetting($@"{this.DefaultPath}Setting.xml"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Loading Setting File | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="filename"></param> | ||||||
|         private void LoadSetting(string filename) |         private void LoadSetting(string filename) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
|   | |||||||
| @@ -218,7 +218,7 @@ namespace DDUtilityApp.LOGPARSER | |||||||
|             { |             { | ||||||
|                 if (this.tabControl1.SelectedTab == this.tabHSMS) |                 if (this.tabControl1.SelectedTab == this.tabHSMS) | ||||||
|                 { |                 { | ||||||
|                     if (this.gridHsms.DataSource == null) return; |                     if (this.gridHsms.DataSource != null) return; | ||||||
|  |  | ||||||
|                     string remotePath = $"/{this.Account.DefaultPath}/{this.Equipment.EquipmentID}/THiRA_SECSGEM/HSMS"; |                     string remotePath = $"/{this.Account.DefaultPath}/{this.Equipment.EquipmentID}/THiRA_SECSGEM/HSMS"; | ||||||
|                     switch (this.Account.Access) |                     switch (this.Account.Access) | ||||||
| @@ -911,7 +911,7 @@ namespace DDUtilityApp.LOGPARSER | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 MessageBox.Show($"{grid.SelectedRows.Count}개의 파일을 저장하였습니다."); |                 //MessageBox.Show($"{grid.SelectedRows.Count}개의 파일을 저장하였습니다."); | ||||||
|                 foreach (string file in downfiles) |                 foreach (string file in downfiles) | ||||||
|                     System.Diagnostics.Process.Start(file); |                     System.Diagnostics.Process.Start(file); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -951,6 +951,7 @@ namespace DDUtilityApp.LOGPARSER | |||||||
|         private void BtnDeploySite_Click(object sender, EventArgs e) |         private void BtnDeploySite_Click(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             Process.Start("IEXPLORE.EXE", "http://pms.e1soft.co.kr:8090/Deploy/eqview/"); |             Process.Start("IEXPLORE.EXE", "http://pms.e1soft.co.kr:8090/Deploy/eqview/"); | ||||||
|  |             Clipboard.SetText("http://pms.e1soft.co.kr:8090/Deploy/eqview/"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void BtnTest01_Click(object sender, EventArgs e) |         private void BtnTest01_Click(object sender, EventArgs e) | ||||||
|   | |||||||
| @@ -378,7 +378,7 @@ namespace DDUtilityApp.LOGPARSER.PARSER | |||||||
|  |  | ||||||
|                 dlg = new FrmEqSelector(); |                 dlg = new FrmEqSelector(); | ||||||
|                 dlg.Owner = sender; |                 dlg.Owner = sender; | ||||||
|                 dlg.Size = new System.Drawing.Size(sender.Width - 60, sender.Height - 60); |                 dlg.Size = new System.Drawing.Size(sender.Width - 10, sender.Height - 60); | ||||||
|                 dlg.StartPosition = FormStartPosition.CenterParent; |                 dlg.StartPosition = FormStartPosition.CenterParent; | ||||||
|                 dlg.ServerName = this.ServerName; |                 dlg.ServerName = this.ServerName; | ||||||
|                 dlg.Equipment = sender.Equipment == null ? new EisEquipment() { EquipmentID = this.EquipmentID, Server = new LogServer(this.ServerName)} : sender.Equipment; |                 dlg.Equipment = sender.Equipment == null ? new EisEquipment() { EquipmentID = this.EquipmentID, Server = new LogServer(this.ServerName)} : sender.Equipment; | ||||||
|   | |||||||
							
								
								
									
										272
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | |||||||
|  | namespace DDUtilityApp.MESDOWNLOADER | ||||||
|  | { | ||||||
|  |     partial class FrmServerLog | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Required designer variable. | ||||||
|  |         /// </summary> | ||||||
|  |         private System.ComponentModel.IContainer components = null; | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Clean up any resources being used. | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||||||
|  |         protected override void Dispose(bool disposing) | ||||||
|  |         { | ||||||
|  |             if (disposing && (components != null)) | ||||||
|  |             { | ||||||
|  |                 components.Dispose(); | ||||||
|  |             } | ||||||
|  |             base.Dispose(disposing); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #region Windows Form Designer generated code | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Required method for Designer support - do not modify | ||||||
|  |         /// the contents of this method with the code editor. | ||||||
|  |         /// </summary> | ||||||
|  |         private void InitializeComponent() | ||||||
|  |         { | ||||||
|  |             Telerik.WinControls.UI.TableViewDefinition tableViewDefinition4 = new Telerik.WinControls.UI.TableViewDefinition(); | ||||||
|  |             this.splitContainer1 = new System.Windows.Forms.SplitContainer(); | ||||||
|  |             this.panel1 = new System.Windows.Forms.Panel(); | ||||||
|  |             this.pnlAPList = new System.Windows.Forms.FlowLayoutPanel(); | ||||||
|  |             this.pnlCommand = new System.Windows.Forms.Panel(); | ||||||
|  |             this.btnDownPathOpen = new System.Windows.Forms.Button(); | ||||||
|  |             this.btnDownPathChange = new System.Windows.Forms.Button(); | ||||||
|  |             this.btnRefresh = new System.Windows.Forms.Button(); | ||||||
|  |             this.tboxDownPath = new System.Windows.Forms.TextBox(); | ||||||
|  |             this.label2 = new System.Windows.Forms.Label(); | ||||||
|  |             this.cboxServer = new System.Windows.Forms.ComboBox(); | ||||||
|  |             this.label1 = new System.Windows.Forms.Label(); | ||||||
|  |             this.splitContainer2 = new System.Windows.Forms.SplitContainer(); | ||||||
|  |             this.treeFolder = new System.Windows.Forms.TreeView(); | ||||||
|  |             this.gridFiles = new JWH.CONTROL.GridViewEx(); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); | ||||||
|  |             this.splitContainer1.Panel1.SuspendLayout(); | ||||||
|  |             this.splitContainer1.Panel2.SuspendLayout(); | ||||||
|  |             this.splitContainer1.SuspendLayout(); | ||||||
|  |             this.panel1.SuspendLayout(); | ||||||
|  |             this.pnlCommand.SuspendLayout(); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); | ||||||
|  |             this.splitContainer2.Panel1.SuspendLayout(); | ||||||
|  |             this.splitContainer2.Panel2.SuspendLayout(); | ||||||
|  |             this.splitContainer2.SuspendLayout(); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.gridFiles)).BeginInit(); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.gridFiles.MasterTemplate)).BeginInit(); | ||||||
|  |             this.SuspendLayout(); | ||||||
|  |             //  | ||||||
|  |             // splitContainer1 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; | ||||||
|  |             this.splitContainer1.Location = new System.Drawing.Point(3, 3); | ||||||
|  |             this.splitContainer1.Name = "splitContainer1"; | ||||||
|  |             this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; | ||||||
|  |             //  | ||||||
|  |             // splitContainer1.Panel1 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer1.Panel1.Controls.Add(this.panel1); | ||||||
|  |             this.splitContainer1.Panel1MinSize = 94; | ||||||
|  |             //  | ||||||
|  |             // splitContainer1.Panel2 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); | ||||||
|  |             this.splitContainer1.Size = new System.Drawing.Size(794, 569); | ||||||
|  |             this.splitContainer1.SplitterDistance = 94; | ||||||
|  |             this.splitContainer1.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // panel1 | ||||||
|  |             //  | ||||||
|  |             this.panel1.Controls.Add(this.pnlAPList); | ||||||
|  |             this.panel1.Controls.Add(this.pnlCommand); | ||||||
|  |             this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.panel1.Location = new System.Drawing.Point(0, 0); | ||||||
|  |             this.panel1.Name = "panel1"; | ||||||
|  |             this.panel1.Size = new System.Drawing.Size(794, 94); | ||||||
|  |             this.panel1.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // pnlAPList | ||||||
|  |             //  | ||||||
|  |             this.pnlAPList.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.pnlAPList.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; | ||||||
|  |             this.pnlAPList.Location = new System.Drawing.Point(722, 0); | ||||||
|  |             this.pnlAPList.Name = "pnlAPList"; | ||||||
|  |             this.pnlAPList.Padding = new System.Windows.Forms.Padding(0, 10, 0, 0); | ||||||
|  |             this.pnlAPList.Size = new System.Drawing.Size(72, 94); | ||||||
|  |             this.pnlAPList.TabIndex = 1; | ||||||
|  |             //  | ||||||
|  |             // pnlCommand | ||||||
|  |             //  | ||||||
|  |             this.pnlCommand.Controls.Add(this.btnDownPathOpen); | ||||||
|  |             this.pnlCommand.Controls.Add(this.btnDownPathChange); | ||||||
|  |             this.pnlCommand.Controls.Add(this.btnRefresh); | ||||||
|  |             this.pnlCommand.Controls.Add(this.tboxDownPath); | ||||||
|  |             this.pnlCommand.Controls.Add(this.label2); | ||||||
|  |             this.pnlCommand.Controls.Add(this.cboxServer); | ||||||
|  |             this.pnlCommand.Controls.Add(this.label1); | ||||||
|  |             this.pnlCommand.Dock = System.Windows.Forms.DockStyle.Left; | ||||||
|  |             this.pnlCommand.Location = new System.Drawing.Point(0, 0); | ||||||
|  |             this.pnlCommand.Name = "pnlCommand"; | ||||||
|  |             this.pnlCommand.Size = new System.Drawing.Size(722, 94); | ||||||
|  |             this.pnlCommand.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // btnDownPathOpen | ||||||
|  |             //  | ||||||
|  |             this.btnDownPathOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|  |             this.btnDownPathOpen.Location = new System.Drawing.Point(622, 62); | ||||||
|  |             this.btnDownPathOpen.Name = "btnDownPathOpen"; | ||||||
|  |             this.btnDownPathOpen.Size = new System.Drawing.Size(90, 23); | ||||||
|  |             this.btnDownPathOpen.TabIndex = 6; | ||||||
|  |             this.btnDownPathOpen.Text = "Open"; | ||||||
|  |             this.btnDownPathOpen.UseVisualStyleBackColor = true; | ||||||
|  |             //  | ||||||
|  |             // btnDownPathChange | ||||||
|  |             //  | ||||||
|  |             this.btnDownPathChange.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|  |             this.btnDownPathChange.Location = new System.Drawing.Point(622, 37); | ||||||
|  |             this.btnDownPathChange.Name = "btnDownPathChange"; | ||||||
|  |             this.btnDownPathChange.Size = new System.Drawing.Size(90, 23); | ||||||
|  |             this.btnDownPathChange.TabIndex = 5; | ||||||
|  |             this.btnDownPathChange.Text = "Change"; | ||||||
|  |             this.btnDownPathChange.UseVisualStyleBackColor = true; | ||||||
|  |             //  | ||||||
|  |             // btnRefresh | ||||||
|  |             //  | ||||||
|  |             this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|  |             this.btnRefresh.Location = new System.Drawing.Point(622, 10); | ||||||
|  |             this.btnRefresh.Name = "btnRefresh"; | ||||||
|  |             this.btnRefresh.Size = new System.Drawing.Size(90, 23); | ||||||
|  |             this.btnRefresh.TabIndex = 4; | ||||||
|  |             this.btnRefresh.Text = "Refresh"; | ||||||
|  |             this.btnRefresh.UseVisualStyleBackColor = true; | ||||||
|  |             //  | ||||||
|  |             // tboxDownPath | ||||||
|  |             //  | ||||||
|  |             this.tboxDownPath.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)  | ||||||
|  |             | System.Windows.Forms.AnchorStyles.Left)  | ||||||
|  |             | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|  |             this.tboxDownPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; | ||||||
|  |             this.tboxDownPath.Location = new System.Drawing.Point(136, 38); | ||||||
|  |             this.tboxDownPath.Multiline = true; | ||||||
|  |             this.tboxDownPath.Name = "tboxDownPath"; | ||||||
|  |             this.tboxDownPath.ScrollBars = System.Windows.Forms.ScrollBars.Both; | ||||||
|  |             this.tboxDownPath.Size = new System.Drawing.Size(480, 47); | ||||||
|  |             this.tboxDownPath.TabIndex = 3; | ||||||
|  |             //  | ||||||
|  |             // label2 | ||||||
|  |             //  | ||||||
|  |             this.label2.Location = new System.Drawing.Point(10, 38); | ||||||
|  |             this.label2.Name = "label2"; | ||||||
|  |             this.label2.Size = new System.Drawing.Size(120, 23); | ||||||
|  |             this.label2.TabIndex = 2; | ||||||
|  |             this.label2.Text = "로컬디렉토리 : "; | ||||||
|  |             this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; | ||||||
|  |             //  | ||||||
|  |             // cboxServer | ||||||
|  |             //  | ||||||
|  |             this.cboxServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)  | ||||||
|  |             | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|  |             this.cboxServer.FormattingEnabled = true; | ||||||
|  |             this.cboxServer.Location = new System.Drawing.Point(136, 12); | ||||||
|  |             this.cboxServer.Name = "cboxServer"; | ||||||
|  |             this.cboxServer.Size = new System.Drawing.Size(480, 20); | ||||||
|  |             this.cboxServer.TabIndex = 1; | ||||||
|  |             //  | ||||||
|  |             // label1 | ||||||
|  |             //  | ||||||
|  |             this.label1.Location = new System.Drawing.Point(10, 10); | ||||||
|  |             this.label1.Name = "label1"; | ||||||
|  |             this.label1.Size = new System.Drawing.Size(120, 23); | ||||||
|  |             this.label1.TabIndex = 0; | ||||||
|  |             this.label1.Text = "Server : "; | ||||||
|  |             this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; | ||||||
|  |             //  | ||||||
|  |             // splitContainer2 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.splitContainer2.Location = new System.Drawing.Point(0, 0); | ||||||
|  |             this.splitContainer2.Name = "splitContainer2"; | ||||||
|  |             //  | ||||||
|  |             // splitContainer2.Panel1 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer2.Panel1.Controls.Add(this.treeFolder); | ||||||
|  |             //  | ||||||
|  |             // splitContainer2.Panel2 | ||||||
|  |             //  | ||||||
|  |             this.splitContainer2.Panel2.Controls.Add(this.gridFiles); | ||||||
|  |             this.splitContainer2.Size = new System.Drawing.Size(794, 471); | ||||||
|  |             this.splitContainer2.SplitterDistance = 264; | ||||||
|  |             this.splitContainer2.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // treeFolder | ||||||
|  |             //  | ||||||
|  |             this.treeFolder.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.treeFolder.Location = new System.Drawing.Point(0, 0); | ||||||
|  |             this.treeFolder.Name = "treeFolder"; | ||||||
|  |             this.treeFolder.Size = new System.Drawing.Size(264, 471); | ||||||
|  |             this.treeFolder.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // gridFiles | ||||||
|  |             //  | ||||||
|  |             this.gridFiles.BackColor = System.Drawing.SystemColors.ControlLightLight; | ||||||
|  |             this.gridFiles.ColumnResizeKey = System.Windows.Forms.Keys.F6; | ||||||
|  |             this.gridFiles.Dock = System.Windows.Forms.DockStyle.Fill; | ||||||
|  |             this.gridFiles.Location = new System.Drawing.Point(0, 0); | ||||||
|  |             //  | ||||||
|  |             //  | ||||||
|  |             //  | ||||||
|  |             this.gridFiles.MasterTemplate.ViewDefinition = tableViewDefinition4; | ||||||
|  |             this.gridFiles.Name = "gridViewEx1"; | ||||||
|  |             //  | ||||||
|  |             //  | ||||||
|  |             //  | ||||||
|  |             this.gridFiles.RootElement.ControlBounds = new System.Drawing.Rectangle(0, 0, 240, 150); | ||||||
|  |             this.gridFiles.Size = new System.Drawing.Size(526, 471); | ||||||
|  |             this.gridFiles.TabIndex = 0; | ||||||
|  |             //  | ||||||
|  |             // FrmServerLog | ||||||
|  |             //  | ||||||
|  |             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); | ||||||
|  |             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||||||
|  |             this.ClientSize = new System.Drawing.Size(800, 575); | ||||||
|  |             this.Controls.Add(this.splitContainer1); | ||||||
|  |             this.Name = "FrmServerLog"; | ||||||
|  |             this.Padding = new System.Windows.Forms.Padding(3); | ||||||
|  |             this.Text = "FrmServerLog"; | ||||||
|  |             this.splitContainer1.Panel1.ResumeLayout(false); | ||||||
|  |             this.splitContainer1.Panel2.ResumeLayout(false); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); | ||||||
|  |             this.splitContainer1.ResumeLayout(false); | ||||||
|  |             this.panel1.ResumeLayout(false); | ||||||
|  |             this.pnlCommand.ResumeLayout(false); | ||||||
|  |             this.pnlCommand.PerformLayout(); | ||||||
|  |             this.splitContainer2.Panel1.ResumeLayout(false); | ||||||
|  |             this.splitContainer2.Panel2.ResumeLayout(false); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); | ||||||
|  |             this.splitContainer2.ResumeLayout(false); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.gridFiles.MasterTemplate)).EndInit(); | ||||||
|  |             ((System.ComponentModel.ISupportInitialize)(this.gridFiles)).EndInit(); | ||||||
|  |             this.ResumeLayout(false); | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #endregion | ||||||
|  |  | ||||||
|  |         private System.Windows.Forms.SplitContainer splitContainer1; | ||||||
|  |         private System.Windows.Forms.Panel panel1; | ||||||
|  |         private System.Windows.Forms.SplitContainer splitContainer2; | ||||||
|  |         private System.Windows.Forms.FlowLayoutPanel pnlAPList; | ||||||
|  |         private System.Windows.Forms.Panel pnlCommand; | ||||||
|  |         private System.Windows.Forms.Label label1; | ||||||
|  |         private System.Windows.Forms.TextBox tboxDownPath; | ||||||
|  |         private System.Windows.Forms.Label label2; | ||||||
|  |         private System.Windows.Forms.ComboBox cboxServer; | ||||||
|  |         private System.Windows.Forms.Button btnDownPathOpen; | ||||||
|  |         private System.Windows.Forms.Button btnDownPathChange; | ||||||
|  |         private System.Windows.Forms.Button btnRefresh; | ||||||
|  |         private System.Windows.Forms.TreeView treeFolder; | ||||||
|  |         private JWH.CONTROL.GridViewEx gridFiles; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										538
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										538
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,538 @@ | |||||||
|  | using DDUtilityApp.LOGPARSER.DATA; | ||||||
|  | using JWH; | ||||||
|  | using JWH.NETWORK; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Configuration; | ||||||
|  | using System.Data; | ||||||
|  | using System.Diagnostics; | ||||||
|  | using System.Drawing; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Windows.Forms; | ||||||
|  | using Telerik.WinControls.UI; | ||||||
|  |  | ||||||
|  | namespace DDUtilityApp.MESDOWNLOADER | ||||||
|  | { | ||||||
|  |     public partial class FrmServerLog: Form | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         private DataSet DSSetting { get; set; } = null; | ||||||
|  |  | ||||||
|  |         private DataTable DTFileInfo { get; set; } = null; | ||||||
|  |  | ||||||
|  |         public FrmServerLog() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |  | ||||||
|  |             this.SetLayout(); | ||||||
|  |             this.SetEventHandler(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private void SetLayout() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  | #if DEBUG | ||||||
|  |                 this.Text = $"ServerLog Download - Ver. {Application.ProductVersion} : DEBUG"; | ||||||
|  | #else | ||||||
|  |                 this.Text = $"ServerLog Download - Ver. {Application.ProductVersion}"; | ||||||
|  | #endif | ||||||
|  |                 this.Font = new Font("돋움체", 9); | ||||||
|  |  | ||||||
|  |                 this.CreateDTFileInfo(); | ||||||
|  |                 this.SetCboxServer(); | ||||||
|  |                 this.GridFiles_Setting(); | ||||||
|  |  | ||||||
|  |                 this.tboxDownPath.ReadOnly = true; | ||||||
|  |                 this.tboxDownPath.Text = GlobalVariable.Instance.DownloadPathServerLog; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private void SetEventHandler() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 this.cboxServer.SelectedIndexChanged += this.CboxServer_SelectedIndexChanged; | ||||||
|  |                 this.btnRefresh.Click += this.BtnRefresh_Click; | ||||||
|  |                 this.btnDownPathChange.Click += this.BtnDownPathChange_Click; | ||||||
|  |                 this.btnDownPathOpen.Click += this.BtnDownPathOpen_Click; | ||||||
|  |  | ||||||
|  |                 this.treeFolder.AfterSelect += this.TreeFolder_AfterSelect; | ||||||
|  |  | ||||||
|  |                 this.gridFiles.CellDoubleClick += this.GridFiles_CellDoubleClick; | ||||||
|  |                 this.gridFiles.KeyDown += this.GridFiles_KeyDown; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #region [ Controls ] -------------------------------------------------- | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// 서버선택 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="sender"></param> | ||||||
|  |         /// <param name="e"></param> | ||||||
|  |         private void CboxServer_SelectedIndexChanged(object sender, EventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 this.GridFiles_Setting(); | ||||||
|  |                 if (this.DSSetting == null || this.DSSetting.Tables.Contains("Item") == false) return; | ||||||
|  |  | ||||||
|  |                 int value = (int)this.cboxServer.SelectedValue; | ||||||
|  |                 var query = from dtServer in DSSetting.Tables["Server"].AsEnumerable() | ||||||
|  |                             join dtItem in DSSetting.Tables["Item"].AsEnumerable() | ||||||
|  |                             on dtServer.Field<int>("Server_Id") equals dtItem.Field<int>("Server_Id") | ||||||
|  |                             where dtItem.Field<int>("Server_Id") == value | ||||||
|  |                             select new | ||||||
|  |                             { | ||||||
|  |                                 name = dtServer.Field<string>("name"), | ||||||
|  |                                 nameap = dtItem.Field<string>("name"), | ||||||
|  |                                 url = dtItem.Field<string>("url"), | ||||||
|  |                                 dir = dtItem.Field<string>("dir"), | ||||||
|  |                                 conkey = dtItem.Field<string>("conkey"), | ||||||
|  |                                 Server_Id = dtItem.Field<int>("Server_Id"), | ||||||
|  |                             }; | ||||||
|  |  | ||||||
|  |                 foreach (Control control in this.pnlAPList.Controls) | ||||||
|  |                     control.Dispose(); | ||||||
|  |                 this.pnlAPList.Controls.Clear(); | ||||||
|  |  | ||||||
|  |                 int index = 0; | ||||||
|  |                 foreach (var item in query) | ||||||
|  |                 { | ||||||
|  |                     string[] splitIP = item.url.Split('.'); | ||||||
|  |                     CheckBox chk = new CheckBox() | ||||||
|  |                     { | ||||||
|  |                         Text = $"{item.nameap} ({splitIP[splitIP.Length - 1]})", | ||||||
|  |                         AutoSize = true, | ||||||
|  |                         Checked = true, | ||||||
|  |                         Padding = new Padding(5, 3, 3, 5), | ||||||
|  |                         Margin = new Padding(0), | ||||||
|  |                         Tag = item.nameap, | ||||||
|  |                     }; | ||||||
|  |                     index++; | ||||||
|  |                     this.pnlAPList.Controls.Add(chk); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 this.treeFolder.Nodes.Clear(); | ||||||
|  |                 TreeNode rootNode = this.treeFolder.Nodes.Add("ROOT"); | ||||||
|  |                 this.treeFolder.SelectedNode = rootNode; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// 현재 (Treeview.SelectedNode)경로의 파일목록 갱신 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="sender"></param> | ||||||
|  |         /// <param name="e"></param> | ||||||
|  |         private void BtnRefresh_Click(object sender, EventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 this.Cursor = Cursors.WaitCursor; | ||||||
|  |                 this.SuspendLayout(); | ||||||
|  |                 this.DTFileInfo.Rows.Clear(); | ||||||
|  |                 this.gridFiles.DataSource = null; | ||||||
|  |  | ||||||
|  |                 int server_Id = (int)this.cboxServer.SelectedValue; | ||||||
|  |                 TreeNode currentNode = this.treeFolder.SelectedNode; | ||||||
|  |                 if (currentNode == null) return; | ||||||
|  |                 string subPath = currentNode.Tag as string; | ||||||
|  |  | ||||||
|  |                 foreach (Control control in this.pnlAPList.Controls) | ||||||
|  |                 { | ||||||
|  |                     CheckBox chk = control as CheckBox; | ||||||
|  |                     if (chk == null || chk.Checked == false) continue; | ||||||
|  |  | ||||||
|  |                     string nameap = control.Tag as string; | ||||||
|  |                     if (string.IsNullOrEmpty(nameap)) continue; | ||||||
|  |  | ||||||
|  |                     DataRow[] rows = this.DSSetting.Tables["Item"].Select($"Server_Id='{server_Id}' AND name='{nameap}'"); | ||||||
|  |                     foreach (DataRow row in rows) | ||||||
|  |                     { | ||||||
|  |                         string url = row["url"] as string; | ||||||
|  |                         string dir = row["dir"] as string; | ||||||
|  |                         string conkey = row["conkey"] as string; | ||||||
|  |  | ||||||
|  |                         string userId = this.GetUserIdFromConkey(conkey); | ||||||
|  |                         string password = this.GetPasswordFromConkey(conkey); | ||||||
|  |                         string currentPath = string.IsNullOrEmpty(subPath) ? dir : System.IO.Path.Combine(dir, subPath); | ||||||
|  |  | ||||||
|  |                         FtpsClient.Initialize(url, userId, password); | ||||||
|  |                         var files = FtpsClient.GetFtpsList(currentPath); | ||||||
|  |  | ||||||
|  |                         foreach (var file in files) | ||||||
|  |                         { | ||||||
|  |                             DataRow rowFile = this.DTFileInfo.NewRow(); | ||||||
|  |                             rowFile["nameap"] = nameap; | ||||||
|  |                             rowFile["Name"] = file.Name; | ||||||
|  |                             rowFile["FileName"] = file.Name; | ||||||
|  |                             rowFile["Size"] = this.GetFileSize(file.Size, FileSizeType.MB); | ||||||
|  |                             rowFile["Modified"] = file.Modified.ToString("yyyy-MM-dd HH:mm:ss"); | ||||||
|  |                             rowFile["Type"] = file.Type; | ||||||
|  |                             rowFile["url"] = url; | ||||||
|  |                             rowFile["dir"] = dir; | ||||||
|  |                             rowFile["subpath"] = subPath; | ||||||
|  |                             rowFile["userId"] = userId; | ||||||
|  |                             rowFile["password"] = password; | ||||||
|  |                             this.DTFileInfo.Rows.Add(rowFile); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 this.DTFileInfo.DefaultView.RowFilter = $"Type='Directory'"; | ||||||
|  |                 this.DTFileInfo.DefaultView.Sort = "FileName ASC"; | ||||||
|  |                 foreach (DataRow row in this.DTFileInfo.DefaultView.ToTable(true, "FileName").Rows) | ||||||
|  |                 { | ||||||
|  |  | ||||||
|  |                     string fileName = row["FileName"] as string; | ||||||
|  |                     if (string.IsNullOrEmpty(fileName)) continue; | ||||||
|  |                     if (currentNode.Nodes.ContainsKey(fileName)) continue; | ||||||
|  |  | ||||||
|  |                     TreeNode node = currentNode.Nodes.Add(fileName, fileName); | ||||||
|  |                     node.Tag = string.IsNullOrEmpty(currentNode.Tag as string) ? fileName : System.IO.Path.Combine(currentNode.Tag as string, fileName); | ||||||
|  |                 } | ||||||
|  |                 currentNode.Expand(); | ||||||
|  |  | ||||||
|  |                 this.DTFileInfo.DefaultView.RowFilter = "Type='File'"; | ||||||
|  |                 this.DTFileInfo.DefaultView.Sort = "Modified DESC"; | ||||||
|  |                 this.gridFiles.DataSource = this.DTFileInfo; | ||||||
|  |                 this.gridFiles.BestFitColumns(); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |             finally | ||||||
|  |             { | ||||||
|  |                 this.ResumeLayout(); | ||||||
|  |                 this.Cursor = Cursors.Default; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// 로그파일 다운로드 폴더설정 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="sender"></param> | ||||||
|  |         /// <param name="e"></param> | ||||||
|  |         private void BtnDownPathChange_Click(object sender, EventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (string.IsNullOrEmpty(this.tboxDownPath.Text)) | ||||||
|  |                     this.tboxDownPath.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); | ||||||
|  |  | ||||||
|  |                 using (FolderBrowserDialog dlg = new FolderBrowserDialog()) | ||||||
|  |                 { | ||||||
|  |                     dlg.SelectedPath = this.tboxDownPath.Text; | ||||||
|  |                     if (dlg.ShowDialog() == DialogResult.OK) | ||||||
|  |                     { | ||||||
|  |                         this.tboxDownPath.Text = dlg.SelectedPath; | ||||||
|  |                         GlobalVariable.Instance.DownloadPathServerLog = this.tboxDownPath.Text; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// 로그파일 다운로드 폴더열기 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="sender"></param> | ||||||
|  |         /// <param name="e"></param> | ||||||
|  |         private void BtnDownPathOpen_Click(object sender, EventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 Process.Start("explorer.exe", this.tboxDownPath.Text); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private void TreeFolder_AfterSelect(object sender, TreeViewEventArgs e) | ||||||
|  |         { | ||||||
|  |             this.BtnRefresh_Click(this.btnRefresh, new EventArgs()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #endregion | ||||||
|  |  | ||||||
|  |         #region [ GridFiles ] ------------------------------------------------- | ||||||
|  |  | ||||||
|  |         private void GridFiles_Setting() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 this.gridFiles.SelectionMode = GridViewSelectionMode.FullRowSelect; | ||||||
|  |                 this.gridFiles.MultiSelect = true; | ||||||
|  |                 this.gridFiles.TableElement.RowHeight = 22; | ||||||
|  |                 this.gridFiles.Columns.Clear(); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("nameap") { HeaderText = "Server", ReadOnly = true }); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("Name") { ReadOnly=true, IsVisible = false }); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("FileName") { ReadOnly = true }); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("Size") { ReadOnly = true, TextAlignment = ContentAlignment.MiddleRight }); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("Modified") { ReadOnly = true }); | ||||||
|  |                 this.gridFiles.Columns.Add(new GridViewTextBoxColumn("Type") { ReadOnly = true }); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private void GridFiles_KeyDown(object sender, KeyEventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 if (e.KeyCode != Keys.Enter) return; | ||||||
|  |  | ||||||
|  |                 this.GridFiles_CellDoubleClick(this.gridFiles, null); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void GridFiles_CellDoubleClick(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 List<DataRow> rows = new List<DataRow>(); | ||||||
|  |                 List<string> downloads = new List<string>(); | ||||||
|  |  | ||||||
|  |                 if (e != null) | ||||||
|  |                 { | ||||||
|  |                     // 더블클릭된 파일 추가 | ||||||
|  |                     DataRowView view = e.Row.DataBoundItem as DataRowView; | ||||||
|  |                     if (view != null && view.Row != null) rows.Add(view.Row); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     // 선택된 파일들 추가 | ||||||
|  |                     foreach(GridViewRowInfo row in this.gridFiles.SelectedRows) | ||||||
|  |                     { | ||||||
|  |                         DataRowView view = row.DataBoundItem as DataRowView; | ||||||
|  |                         if (view != null && view.Row != null) rows.Add(view.Row); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                     // 다운로드 | ||||||
|  |                 bool hasZip = false; | ||||||
|  |                 using (ProgressForm frmProgress = new ProgressForm(rows.Count)) | ||||||
|  |                 { | ||||||
|  |                     int countDown = 0; | ||||||
|  |                     frmProgress.Show(); | ||||||
|  |                     frmProgress.UpdateProgress(string.Empty, countDown); | ||||||
|  |  | ||||||
|  |                     foreach(DataRow row in rows) | ||||||
|  |                     { | ||||||
|  |                         string fileName = row["FileName"] as string; | ||||||
|  |                         string url = row["url"] as string; | ||||||
|  |                         string dir = row["dir"] as string; | ||||||
|  |                         string subpath = row["subpath"] as string; | ||||||
|  |                         string userId = row["userId"] as string; | ||||||
|  |                         string password = row["password"] as string; | ||||||
|  |  | ||||||
|  |                         string extension = System.IO.Path.GetExtension(fileName); | ||||||
|  |                         if (string.Compare(extension, ".Zip", true) == 0) hasZip = true; | ||||||
|  |                         else if (string.Compare(extension, ".Log", false) == 0) fileName += ".Log"; | ||||||
|  |  | ||||||
|  |                         List<string> paths = new List<string>(); | ||||||
|  |                         if (!string.IsNullOrEmpty(dir)) paths.Add(dir); | ||||||
|  |                         if (!string.IsNullOrEmpty(subpath)) paths.Add(subpath); | ||||||
|  |                         if (!string.IsNullOrEmpty(fileName)) paths.Add(fileName); | ||||||
|  |                         string pathSRC = System.IO.Path.Combine(paths.ToArray()); | ||||||
|  |                         string pathDST = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text, fileName); | ||||||
|  |                         frmProgress.UpdateProgress($"{fileName}", countDown); | ||||||
|  |  | ||||||
|  |                         FtpsClient.Disconnect(); | ||||||
|  |                         FtpsClient.Initialize(url, userId, password); | ||||||
|  |                         bool isSuccess = await Task.Run(() => | ||||||
|  |                             FtpsClient.DownloadFtpsFile(pathSRC, pathDST) | ||||||
|  |                         ); | ||||||
|  |  | ||||||
|  |                         countDown++; | ||||||
|  |                         if (isSuccess) downloads.Add(pathDST); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (downloads.Count < 1) | ||||||
|  |                 { | ||||||
|  |                     MessageBox.Show($"다운로드된 파일이 없습니다.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // FileMerge | ||||||
|  |                 if (downloads.Count == 1) | ||||||
|  |                 { | ||||||
|  |                     string fileName = downloads[0]; | ||||||
|  |                     if (hasZip) | ||||||
|  |                     { | ||||||
|  |                         string path = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text, fileName); | ||||||
|  |                         string command = $"/select,{path}"; | ||||||
|  |                         Process.Start($"explorer.exe", command); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         string extension = System.IO.Path.GetExtension(fileName); | ||||||
|  |                         if (string.Compare(extension, ".Log", true) != 0) | ||||||
|  |                             System.IO.File.Move(fileName, fileName += ".log"); | ||||||
|  |                         System.Diagnostics.Process.Start(fileName); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     if (hasZip) | ||||||
|  |                     { | ||||||
|  |                         string path = System.IO.Path.Combine(this.tboxDownPath.Text, this.cboxServer.Text); | ||||||
|  |                         string command = $"/select,{path}"; | ||||||
|  |                         Process.Start($"explorer.exe", path); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         string filename = Util.GetFileMerge(downloads); | ||||||
|  |                         System.Diagnostics.Process.Start(filename); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #endregion | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Server + File 저장테이블 생성 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         private void CreateDTFileInfo() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 this.DTFileInfo = new DataTable(); | ||||||
|  |                 this.DTFileInfo.Columns.Add("nameap", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("Name", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("FileName", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("Size", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("Modified", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("Type", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("url", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("dir", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("subpath", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("userId", typeof(string)); | ||||||
|  |                 this.DTFileInfo.Columns.Add("password", typeof(string)); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// XML 설정파일 로딩 및 CboxServer 셋팅 | ||||||
|  |         /// </summary> | ||||||
|  |         private void SetCboxServer() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 string path = ConfigurationManager.AppSettings["BULK_VIEWER"]; | ||||||
|  |                 this.DSSetting = XmlToDsConverter.ConvertXmlToDataSet(path); | ||||||
|  |                 if (this.DSSetting == null || this.DSSetting.Tables.Count < 1 || this.DSSetting.Tables.Contains("Server") == false) | ||||||
|  |                 { | ||||||
|  |                     MessageBox.Show("XML 데이터를 불러올 수 없습니다.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 this.cboxServer.DropDownStyle = ComboBoxStyle.DropDownList; | ||||||
|  |                 this.cboxServer.DataSource = DSSetting.Tables["Server"]; | ||||||
|  |                 this.cboxServer.DisplayMember = "name"; | ||||||
|  |                 this.cboxServer.ValueMember = "Server_Id"; | ||||||
|  |                 this.cboxServer.SelectedIndex = -1; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// conkey to Base64 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="conkey"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         private string GetUserIdFromConkey(string conkey) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 string value = Util.GetBase64(conkey); | ||||||
|  |                 string[] items = value.Split(':'); | ||||||
|  |                 if (items == null || items.Length < 1) return string.Empty; | ||||||
|  |  | ||||||
|  |                 return items[0]; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |                 return string.Empty; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// conkey to Base64 | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="conkey"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         private string GetPasswordFromConkey(string conkey) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 string value = Util.GetBase64(conkey); | ||||||
|  |                 string[] items = value.Split(':'); | ||||||
|  |                 if (items == null || items.Length < 2) return string.Empty; | ||||||
|  |  | ||||||
|  |                 return items[1]; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 XLogger.Instance.Fatal(ex, true); | ||||||
|  |                 return string.Empty; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public string GetFileSize(long length, FileSizeType format = FileSizeType.Auto) | ||||||
|  |         { | ||||||
|  |             int index = 0; | ||||||
|  |             int nFormat = (int)format; | ||||||
|  |             double value = length; | ||||||
|  |             for (index = 0; index < nFormat; index++) | ||||||
|  |             { | ||||||
|  |                 if (format == FileSizeType.Auto && value < 1024) break; | ||||||
|  |                 value /= 1024; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return $"{value.ToString("N2")} {(FileSizeType)index}"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										123
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.resx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								DDUtilityApp/MESDOWNLOADER/FrmServerLog.resx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <root> | ||||||
|  |   <!--  | ||||||
|  |     Microsoft ResX Schema  | ||||||
|  |      | ||||||
|  |     Version 2.0 | ||||||
|  |      | ||||||
|  |     The primary goals of this format is to allow a simple XML format  | ||||||
|  |     that is mostly human readable. The generation and parsing of the  | ||||||
|  |     various data types are done through the TypeConverter classes  | ||||||
|  |     associated with the data types. | ||||||
|  |      | ||||||
|  |     Example: | ||||||
|  |      | ||||||
|  |     ... ado.net/XML headers & schema ... | ||||||
|  |     <resheader name="resmimetype">text/microsoft-resx</resheader> | ||||||
|  |     <resheader name="version">2.0</resheader> | ||||||
|  |     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||||||
|  |     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||||||
|  |     <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||||||
|  |     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||||||
|  |     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||||||
|  |         <value>[base64 mime encoded serialized .NET Framework object]</value> | ||||||
|  |     </data> | ||||||
|  |     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||||
|  |         <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||||||
|  |         <comment>This is a comment</comment> | ||||||
|  |     </data> | ||||||
|  |                  | ||||||
|  |     There are any number of "resheader" rows that contain simple  | ||||||
|  |     name/value pairs. | ||||||
|  |      | ||||||
|  |     Each data row contains a name, and value. The row also contains a  | ||||||
|  |     type or mimetype. Type corresponds to a .NET class that support  | ||||||
|  |     text/value conversion through the TypeConverter architecture.  | ||||||
|  |     Classes that don't support this are serialized and stored with the  | ||||||
|  |     mimetype set. | ||||||
|  |      | ||||||
|  |     The mimetype is used for serialized objects, and tells the  | ||||||
|  |     ResXResourceReader how to depersist the object. This is currently not  | ||||||
|  |     extensible. For a given mimetype the value must be set accordingly: | ||||||
|  |      | ||||||
|  |     Note - application/x-microsoft.net.object.binary.base64 is the format  | ||||||
|  |     that the ResXResourceWriter will generate, however the reader can  | ||||||
|  |     read any of the formats listed below. | ||||||
|  |      | ||||||
|  |     mimetype: application/x-microsoft.net.object.binary.base64 | ||||||
|  |     value   : The object must be serialized with  | ||||||
|  |             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  |      | ||||||
|  |     mimetype: application/x-microsoft.net.object.soap.base64 | ||||||
|  |     value   : The object must be serialized with  | ||||||
|  |             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  |  | ||||||
|  |     mimetype: application/x-microsoft.net.object.bytearray.base64 | ||||||
|  |     value   : The object must be serialized into a byte array  | ||||||
|  |             : using a System.ComponentModel.TypeConverter | ||||||
|  |             : and then encoded with base64 encoding. | ||||||
|  |     --> | ||||||
|  |   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||||||
|  |     <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||||||
|  |     <xsd:element name="root" msdata:IsDataSet="true"> | ||||||
|  |       <xsd:complexType> | ||||||
|  |         <xsd:choice maxOccurs="unbounded"> | ||||||
|  |           <xsd:element name="metadata"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" use="required" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="type" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="mimetype" type="xsd:string" /> | ||||||
|  |               <xsd:attribute ref="xml:space" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="assembly"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:attribute name="alias" type="xsd:string" /> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="data"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||||
|  |                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||||||
|  |               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||||||
|  |               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||||||
|  |               <xsd:attribute ref="xml:space" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |           <xsd:element name="resheader"> | ||||||
|  |             <xsd:complexType> | ||||||
|  |               <xsd:sequence> | ||||||
|  |                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||||
|  |               </xsd:sequence> | ||||||
|  |               <xsd:attribute name="name" type="xsd:string" use="required" /> | ||||||
|  |             </xsd:complexType> | ||||||
|  |           </xsd:element> | ||||||
|  |         </xsd:choice> | ||||||
|  |       </xsd:complexType> | ||||||
|  |     </xsd:element> | ||||||
|  |   </xsd:schema> | ||||||
|  |   <resheader name="resmimetype"> | ||||||
|  |     <value>text/microsoft-resx</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="version"> | ||||||
|  |     <value>2.0</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="reader"> | ||||||
|  |     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||||
|  |   </resheader> | ||||||
|  |   <resheader name="writer"> | ||||||
|  |     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||||
|  |   </resheader> | ||||||
|  |   <metadata name="gridFiles.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | ||||||
|  |     <value>17, 17</value> | ||||||
|  |   </metadata> | ||||||
|  | </root> | ||||||
| @@ -32,7 +32,7 @@ namespace DDUtilityApp.MESDOWNLOADER | |||||||
|         private void ServerLog_Shown(object sender, EventArgs e) |         private void ServerLog_Shown(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             this.WindowState = System.Windows.Forms.FormWindowState.Maximized; |             this.WindowState = System.Windows.Forms.FormWindowState.Maximized; | ||||||
|             txtPath.Text = GlobalVariable.Instance.MesDownloadPath; //Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); |             txtPath.Text = GlobalVariable.Instance.DownloadPathServerLog; //Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); | ||||||
|             SetGridView(); |             SetGridView(); | ||||||
|         } |         } | ||||||
|         private void ServerLog_Resize(object sender, EventArgs e) |         private void ServerLog_Resize(object sender, EventArgs e) | ||||||
| @@ -66,7 +66,7 @@ namespace DDUtilityApp.MESDOWNLOADER | |||||||
|                 { |                 { | ||||||
|                     // 선택한 경로를 텍스트 박스에 표시 |                     // 선택한 경로를 텍스트 박스에 표시 | ||||||
|                     txtPath.Text = folderDialog.SelectedPath; |                     txtPath.Text = folderDialog.SelectedPath; | ||||||
|                     GlobalVariable.Instance.MesDownloadPath = folderDialog.SelectedPath; |                     GlobalVariable.Instance.DownloadPathServerLog = folderDialog.SelectedPath; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -366,8 +366,16 @@ namespace DDUtilityApp.MESDOWNLOADER | |||||||
|                             // 데이터 테이블 생성 후 바인딩 |                             // 데이터 테이블 생성 후 바인딩 | ||||||
|                             foreach (var item in fileList) |                             foreach (var item in fileList) | ||||||
|                             { |                             { | ||||||
|                                 dtFiles.Rows.Add(row.Cells["name"].Value, row.Cells["nameap"].Value, item.Name, item.Size.ToString("N0") |                                 dtFiles.Rows.Add( | ||||||
|                                     , item.Modified.ToString("yyyy-MM-dd HH:mm:ss"), item.Type, row.Cells["url"].Value, row.Cells["dir"].Value, userInfo[0], userInfo[1]); |                                     row.Cells["name"].Value,  | ||||||
|  |                                     row.Cells["nameap"].Value,  | ||||||
|  |                                     item.Name, item.Size.ToString("N0"), | ||||||
|  |                                     item.Modified.ToString("yyyy-MM-dd HH:mm:ss"),  | ||||||
|  |                                     item.Type,  | ||||||
|  |                                     row.Cells["url"].Value,  | ||||||
|  |                                     row.Cells["dir"].Value, | ||||||
|  |                                     userInfo[0], | ||||||
|  |                                     userInfo[1]); | ||||||
|                             } |                             } | ||||||
|  |  | ||||||
|                         } |                         } | ||||||
|   | |||||||
| @@ -70,7 +70,8 @@ namespace DDUtilityApp | |||||||
|  |  | ||||||
|                     #region [ 버튼 생성 정보 ] |                     #region [ 버튼 생성 정보 ] | ||||||
|                     frmMain.Buttons.Add("EIS Log Viewer", new EisParser0()); |                     frmMain.Buttons.Add("EIS Log Viewer", new EisParser0()); | ||||||
|                     frmMain.Buttons.Add("MES Log Download", typeof(MESDOWNLOADER.ServerLog)); |                     //frmMain.Buttons.Add("MES Log Download", typeof(MESDOWNLOADER.ServerLog)); | ||||||
|  |                     frmMain.Buttons.Add("ServerLog Download", typeof(MESDOWNLOADER.FrmServerLog)); | ||||||
|                     //frmMain.Buttons.Add("MIS Log Viewer", new AgvParser()); // 제거  |                     //frmMain.Buttons.Add("MIS Log Viewer", new AgvParser()); // 제거  | ||||||
|                     frmMain.Buttons.Add("FDC Mongo Viewer", typeof(MONGO.FrmFDCMongo)); |                     frmMain.Buttons.Add("FDC Mongo Viewer", typeof(MONGO.FrmFDCMongo)); | ||||||
|                     frmMain.Buttons.Add("HSMS Converter", typeof(LOGPARSER.FrmHsmsViewer)); |                     frmMain.Buttons.Add("HSMS Converter", typeof(LOGPARSER.FrmHsmsViewer)); | ||||||
|   | |||||||
| @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | |||||||
| // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 | ||||||
| // 지정되도록 할 수 있습니다. | // 지정되도록 할 수 있습니다. | ||||||
| // [assembly: AssemblyVersion("1.0.*")] | // [assembly: AssemblyVersion("1.0.*")] | ||||||
| [assembly: AssemblyVersion("2025.02.28.0")] | [assembly: AssemblyVersion("2025.03.14.0")] | ||||||
| [assembly: AssemblyFileVersion("2025.02.28.0")] | [assembly: AssemblyFileVersion("2025.03.14.0")] | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
|   <Server name="FDC"> |   <Server name="FDC"> | ||||||
|     <Item name="AP01" url="192.168.8.212" dir="/FDCLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> |     <Item name="AP01" url="192.168.8.212" dir="/FDCLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> | ||||||
|   </Server> |   </Server> | ||||||
|   <Server name="RMS"> |   <Server name="RTD"> | ||||||
|     <Item name="AP01" url="192.168.8.221" dir="/RTDLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> |     <Item name="AP01" url="192.168.8.221" dir="/RTDLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> | ||||||
|     <Item name="AP02" url="192.168.8.222" dir="/RTDLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> |     <Item name="AP02" url="192.168.8.222" dir="/RTDLog" conkey="bG9ndXNlcjpEYWVkdWNrITE="/> | ||||||
|   </Server> |   </Server> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user