using System; using System.Windows; using System.Text; using System.IO; using System.Security.Cryptography; using log4net; using Quartz; using Quartz.Impl; using Agent.Services; using System.Threading; using System.Configuration; using Quartz.Impl.Matchers; namespace Agent { /// /// App.xaml에 대한 상호 작용 논리 /// public partial class App : Application { public static readonly IScheduler Scheduler = StdSchedulerFactory.GetDefaultScheduler(); public static readonly string _sysPlantCd = @ConfigurationManager.AppSettings["SysPlantCd"]; public static readonly string _userCd = @ConfigurationManager.AppSettings["UserCd"]; public static readonly string _equipCd = @ConfigurationManager.AppSettings["EquipmentCd"]; public static readonly string _exceptExtension = @ConfigurationManager.AppSettings["ExceptExtension"]; public static readonly string _dbServer = @ConfigurationManager.AppSettings["DbServer"]; public static readonly string _dbName = @ConfigurationManager.AppSettings["DbName"]; public static readonly string _dbUser = Decrypt(@ConfigurationManager.AppSettings["DbUser"], "ZR"); public static readonly string _dbPwd = Decrypt(@ConfigurationManager.AppSettings["DbPwd"], "ZR"); //string dbId = Decrypt(GetIni_Values("CONFIG", "dbId", ""), "ZR"); //string dbPw = Decrypt(GetIni_Values("CONFIG", "dbPw", ""), "ZR"); public static readonly string _myConnection = "Server=" + _dbServer + "; Database=" + _dbName + "; User Id=" + _dbUser + "; Password=" + _dbPwd + "; persist security info=true;packet size = 4096; Connect Timeout = 120"; private static readonly ILog log = LogManager.GetLogger(typeof(App)); private readonly string _programName = @ConfigurationManager.AppSettings["ProgramName"]; private readonly HealthService _healthService = new HealthService(); private readonly TrayService _trayService = new TrayService(); private readonly PolicyService _policyService = new PolicyService(); private readonly UserService _userService = new UserService(); public static string _jobuserCd = @ConfigurationManager.AppSettings["UserCd"]; private MainWindow _mainWindow; private Mutex _mutex; private void Application_Startup(object sender, StartupEventArgs e) { PreventDuplicatedApplication(); if (!_healthService.IsConnectionSetting()) { MessageBox.Show("서버 연결 정보가 없습니다.\r\n설정 파일을 확인해 주세요.", "오류", MessageBoxButton.OK, MessageBoxImage.Error); Shutdown(); return; } _healthService.Check(); if (!"OK".Equals(Current.Properties["db_status"])) { MessageBox.Show("서버와의 연결이 원활하지 않습니다.\r\n연결 상태를 확인해 주세요.", "오류", MessageBoxButton.OK, MessageBoxImage.Error); Shutdown(); return; } var user = _userService.GetUserWithJoin(); if (null == user) { MessageBox.Show("에이전트 정보 생성에 실패하였습니다.", "오류", MessageBoxButton.OK, MessageBoxImage.Error); Shutdown(); } _userService.SaveUserProperties(user); _mainWindow = new MainWindow() { Title = _programName }; _mainWindow.Show(); _trayService.GetNotifyIcon().Visible = true; _trayService.GetNotifyIcon().DoubleClick += NotifyIcon_DoubleClick; Scheduler.ListenerManager.AddJobListener(_mainWindow, KeyMatcher.KeyEquals(_healthService.JobKey)); _healthService.ScheduledHealthJob(); _policyService.ScheduledPolicyJob(); Scheduler.Start(); log.Info($"{_programName} 시작 (UserTid={Current.Properties["user_tid"]})"); } private void Application_Exit(object sender, ExitEventArgs e) { Scheduler.Shutdown(); _trayService.DisposeNotifyIcon(); log.Info($"{_programName} 종료 (UserTid={Current.Properties["user_tid"]})"); } private void LoginWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (null != Current.Properties["user_tid"]) { var Main = new MainWindow(); Main.Show(); Scheduler.Start(); } } private void NotifyIcon_DoubleClick(object sender, System.EventArgs e) { foreach (Window window in Current.Windows) { if (1 == Current.Windows.Count && _programName.Equals(window.Title)) { window.Show(); window.WindowState = WindowState.Normal; return; } } } private void PreventDuplicatedApplication() { try { _mutex = new Mutex(false, _programName); if (!_mutex.WaitOne(0, false)) { MessageBox.Show($"{_programName}가 이미 실행중입니다.", "오류", MessageBoxButton.OK, MessageBoxImage.Error); Current.Shutdown(); } } catch (Exception) { Current.Shutdown(); } } public static string Decrypt(string cipherText, string Password) { try { byte[] cipherBytes = Convert.FromBase64String(cipherText); var pdb = new PasswordDeriveBytes(Password, new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); byte[] decryptedData = Decrypt(cipherBytes, pdb.GetBytes(32), pdb.GetBytes(16)); return Encoding.Unicode.GetString(decryptedData); } catch (FormatException e) { return "입력된 값이 정상적으로 암호화 되지 않은 값 입니다"; } } public static byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV) { var ms = new MemoryStream(); Rijndael alg = Rijndael.Create(); alg.Key = Key; alg.IV = IV; var cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(cipherData, 0, cipherData.Length); cs.Close(); byte[] decryptedData = ms.ToArray(); return decryptedData; } } }