using DDUtilityApp.LOGPARSER.DATA; using JWH; using JWH.NETWORK; using Org.BouncyCastle.Tls.Crypto; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using Telerik.WinControls.Drawing; 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 { this.CreateDTFileInfo(); this.SetCboxServer(); this.GridFiles_Setting(); this.tboxDownPath.ReadOnly = true; this.tboxDownPath.Text = GlobalVariable.Instance.MesDownloadPath; this.treeFolder.Font = new Font("돋움체", 10.0F); } 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 ] -------------------------------------------------- /// /// 서버선택 /// /// /// private void CboxServer_SelectedIndexChanged(object sender, EventArgs e) { try { this.GridFiles_Setting(); Color[] backColors = new Color[] { Color.FromArgb(0, 255, 255, 255), Color.FromArgb(255, 255, 255, 220), Color.FromArgb(255, 255, 220, 255), Color.FromArgb(255, 220, 255, 255) }; 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("Server_Id") equals dtItem.Field("Server_Id") where dtItem.Field("Server_Id") == value select new { name = dtServer.Field("name"), nameap = dtItem.Field("name"), url = dtItem.Field("url"), dir = dtItem.Field("dir"), conkey = dtItem.Field("conkey"), Server_Id = dtItem.Field("Server_Id"), }; foreach (Control control in this.pnlAPList.Controls) control.Dispose(); this.pnlAPList.Controls.Clear(); int index = 0; foreach (var item in query) { CheckBox chk = new CheckBox() { Text = $"{item.nameap} ({item.url})", AutoSize = true, Checked = true, Tag = item.nameap, BackColor = backColors[index % 4] }; index++; this.pnlAPList.Controls.Add(chk); ExpressionFormattingObject formatting = new ExpressionFormattingObject($"Marking", $"nameap='{item.nameap}'", true); formatting.RowBackColor = chk.BackColor; this.gridFiles.Columns["nameap"].ConditionalFormattingObjectList.Add(formatting); } this.treeFolder.Nodes.Clear(); TreeNode rootNode = this.treeFolder.Nodes.Add("ROOT"); this.treeFolder.SelectedNode = rootNode; } catch (Exception ex) { XLogger.Instance.Fatal(ex, true); } } /// /// 현재 (Treeview.SelectedNode)경로의 파일목록 갱신 /// /// /// 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["Check"] = false; 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 = ""; 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; } } /// /// 로그파일 다운로드 폴더설정 /// /// /// 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.MesDownloadPath = this.tboxDownPath.Text; } } } catch (Exception ex) { XLogger.Instance.Fatal(ex, true); } } /// /// 로그파일 다운로드 폴더열기 /// /// /// 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.Columns.Clear(); this.gridFiles.Columns.Add(new GridViewCheckBoxColumn("Check") { }); 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 { } catch (Exception ex) { XLogger.Instance.Fatal(ex, true); } } private void GridFiles_CellDoubleClick(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e) { try { } catch (Exception ex) { XLogger.Instance.Fatal(ex, true); } } #endregion /// /// Server + File 저장테이블 생성 /// /// private void CreateDTFileInfo() { try { this.DTFileInfo = new DataTable(); this.DTFileInfo.Columns.Add("Check", typeof(bool)); 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); } } /// /// XML 설정파일 로딩 및 CboxServer 셋팅 /// 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.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); } } /// /// conkey to Base64 /// /// /// 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; } } /// /// conkey to Base64 /// /// /// 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}"; } } }