private async void App_OnStartup(object sender, StartupEventArgs e) { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ClearAllDoFiles(); // Set shutdown mode back to default ShutdownMode = ShutdownMode.OnExplicitShutdown; var isUpdater = Environment.GetCommandLineArgs().Contains("-update"); var isUpdated = Environment.GetCommandLineArgs().Contains("-updated"); if (isUpdater) { var updatersPath = GetRootPath("updaters"); // TODO check the latest files here //var updaterFile = Path.Combine(updatersPath, "nhm_windows_3.0.0.1.zip"); var latestUpdaterFile = GetLatestUpdater(); if (latestUpdaterFile == null) { var restartProcessUpdatefailed = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updateFailed", WindowStyle = ProcessWindowStyle.Normal } }; restartProcessUpdatefailed.Start(); // shutdown Shutdown(); return; } var updaterFile = GetRootPath("updaters", latestUpdaterFile); // TODO find latest var isZip = updaterFile.EndsWith(".zip"); //await Task.Delay(5000); if (isZip) { var progWindow = new UpdateProgress(); progWindow.Show(); var isOk = await UnzipFileAsync(updaterFile, GetRootPath(), progWindow.Progress, CancellationToken.None); progWindow.Close(); await Task.Delay(500); // TODO if something goes wrong just restore the current exe process file var restartProcess = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updated", WindowStyle = ProcessWindowStyle.Normal } }; restartProcess.Start(); } else { // TODO updater should start nhm var startUpdater = new Process { StartInfo = new ProcessStartInfo { FileName = updaterFile, WorkingDirectory = GetRootPath(), WindowStyle = ProcessWindowStyle.Normal } }; startUpdater.Start(); // TODO we should wait and check if we have restarted NiceHash Miner } // shutdown Shutdown(); return; } if (isUpdated) { await Task.Delay(500); // so we release the temp files } await WindowsUptimeCheck.DelayUptime(); bool createdNew = false; try { string appPath = GetHashString(); _mutex = new Mutex(true, appPath, out createdNew); if (!createdNew) { //MessageBox.Show("We have detected you are already running NiceHash Miner. Only a single instance should be running at a time.", "NiceHash Miner Warning", MessageBoxButton.OK, MessageBoxImage.Warning); // shutdown Shutdown(); return; } ClearAllTmpFiles(); // TODO pass parent process PID var latestAppDir = GetLatestApp(); var nhmApp = GetRootPath(latestAppDir, "NiceHashMiner.exe"); var args = $"-lc -PID{Process.GetCurrentProcess().Id}"; if (isUpdated) { args += " -updated"; } var startInfo = new ProcessStartInfo { FileName = nhmApp, Arguments = args, WindowStyle = ProcessWindowStyle.Normal }; var run = true; while (run) { run = false; try { using (var niceHashMiner = new Process { StartInfo = startInfo }) { var hasStarted = niceHashMiner?.Start(); niceHashMiner?.WaitForExit(); // TODO Console.WriteLine(niceHashMiner.ExitCode); // if exit code is 0 then check runasadmin or restart if (IsRunAsAdmin()) { RunAsAdmin.SelfElevate(); } else if (IsCreateLog()) { try { run = true; ClearAllDoFiles(); var exePath = GetRootPath("CreateLogReport.exe"); var startLogInfo = new ProcessStartInfo { FileName = exePath, WindowStyle = ProcessWindowStyle.Minimized, UseShellExecute = true, Arguments = latestAppDir, CreateNoWindow = true }; using (var doCreateLog = Process.Start(startLogInfo)) { doCreateLog.WaitForExit(10 * 1000); } var tmpZipPath = GetRootPath($"tmp._archive_logs.zip"); var desktopZipPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "NiceHashMinerLogs.zip"); File.Copy(tmpZipPath, desktopZipPath, true); } catch (Exception ex) { Console.WriteLine(ex.Message); } ClearAllTmpFiles(); } else if (IsRestart()) { ClearAllDoFiles(); run = true; } else if (IsUpdate()) { run = true; // mark to false if updating doesn't fail ClearAllDoFiles(); var exePath = Assembly.GetExecutingAssembly().Location; var randomPart = DateTime.UtcNow.Millisecond; var tmpLauncher = GetRootPath($"tmp.nhm_updater_{randomPart}.exe"); File.Copy(exePath, tmpLauncher, true); var doUpdate = new Process { StartInfo = new ProcessStartInfo { FileName = tmpLauncher, Arguments = "-update", WindowStyle = ProcessWindowStyle.Normal } }; var updateStarted = doUpdate.Start(); run = !updateStarted; // set if we are good } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } // shutdown Shutdown(); return; } finally { if (createdNew) { _mutex?.ReleaseMutex(); } } }
private async void App_OnStartup(object sender, StartupEventArgs e) { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ClearAllDoFiles(); // Set shutdown mode back to default ShutdownMode = ShutdownMode.OnExplicitShutdown; var isUpdater = Environment.GetCommandLineArgs().Contains("-update"); var isUpdated = Environment.GetCommandLineArgs().Contains("-updated"); if (isUpdater) { var updatersPath = GetRootPath("updaters"); // TODO check the latest files here //var updaterFile = Path.Combine(updatersPath, "nhm_windows_3.0.0.1.zip"); var latestUpdaterFile = GetLatestUpdater(); if (latestUpdaterFile == null) { var restartProcessUpdatefailed = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updateFailed", WindowStyle = ProcessWindowStyle.Normal } }; restartProcessUpdatefailed.Start(); // shutdown Shutdown(); return; } var updaterFile = GetRootPath("updaters", latestUpdaterFile); // TODO find latest var isZip = updaterFile.EndsWith(".zip"); //await Task.Delay(5000); if (isZip) { var pluginPackagesPath = GetRootPath("plugins_packages"); if (Directory.Exists(pluginPackagesPath)) { Directory.Delete(pluginPackagesPath, true); } var progWindow = new UpdateProgress(); progWindow.Show(); var isOk = await UnzipFileAsync(updaterFile, GetRootPath(), progWindow.Progress, CancellationToken.None); progWindow.Close(); await Task.Delay(500); // TODO if something goes wrong just restore the current exe process file var restartProcess = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updated", WindowStyle = ProcessWindowStyle.Normal } }; restartProcess.Start(); } else { // TODO updater should start nhm var startUpdater = new Process { StartInfo = new ProcessStartInfo { FileName = updaterFile, WorkingDirectory = GetRootPath(), WindowStyle = ProcessWindowStyle.Normal } }; startUpdater.Start(); // TODO we should wait and check if we have restarted NiceHash Miner } // shutdown Shutdown(); return; } if (isUpdated) { await Task.Delay(500); // so we release the temp files } await WindowsUptimeCheck.DelayUptime(); bool createdNew = false; try { string appPath = GetHashString(); _mutex = new Mutex(true, appPath, out createdNew); if (!createdNew) { //MessageBox.Show("We have detected you are already running NiceHash Miner. Only a single instance should be running at a time.", "NiceHash Miner Warning", MessageBoxButton.OK, MessageBoxImage.Warning); // shutdown Shutdown(); return; } ClearAllTmpFiles(); // TODO pass parent process PID var latestAppDir = GetLatestApp(); var nhmApp = GetRootPath(latestAppDir, "NiceHashMiner.exe"); var args = $"-lc -PID{Process.GetCurrentProcess().Id}"; if (isUpdated) { args += " -updated"; } var startInfo = new ProcessStartInfo { FileName = nhmApp, Arguments = args, WindowStyle = ProcessWindowStyle.Normal }; var run = true; const int maxRestartCount = 3; int restartCount = 0; const int minRestartTimeInSeconds = 30; while (run) { var startTime = DateTime.UtcNow; run = false; try { using (var niceHashMiner = new Process { StartInfo = startInfo }) { var hasStarted = niceHashMiner?.Start(); niceHashMiner?.WaitForExit(); // TODO Console.WriteLine(niceHashMiner.ExitCode); //in case of crash try to restart the program if (niceHashMiner.ExitCode != 0) { var endTime = DateTime.UtcNow; string path = GetRootPath("logs", "watchdogLog.txt"); if (!File.Exists(path)) { using (var sw = File.CreateText(path)) { sw.WriteLine($"Exit code: {niceHashMiner.ExitCode} ---- {endTime}"); } } else { using (var sw = File.AppendText(path)) { sw.WriteLine($"Exit code: {niceHashMiner.ExitCode} ---- {endTime}"); } } //try to re-run the NHM run = true; //check if too many restarts var elapsedSeconds = (endTime - startTime).TotalSeconds; if (elapsedSeconds < minRestartTimeInSeconds) { restartCount++; } else { restartCount = 0; } if (restartCount >= maxRestartCount) { using (var sw = File.AppendText(path)) { sw.WriteLine($"Too many restarts! Closing nhm"); } MessageBox.Show("NHM experienced too many crashes recently, therefore it will close itself", "Too many restarts"); run = false; } } else { // if exit code is 0 then check runasadmin or restart if (IsRunAsAdmin()) { RunAsAdmin.SelfElevate(); } else if (IsRestart()) { ClearAllDoFiles(); run = true; } else if (IsUpdate()) { run = true; // mark to false if updating doesn't fail ClearAllDoFiles(); var exePath = Assembly.GetExecutingAssembly().Location; var randomPart = DateTime.UtcNow.Millisecond; var tmpLauncher = GetRootPath($"tmp.nhm_updater_{randomPart}.exe"); File.Copy(exePath, tmpLauncher, true); var doUpdate = new Process { StartInfo = new ProcessStartInfo { FileName = tmpLauncher, Arguments = "-update", WindowStyle = ProcessWindowStyle.Normal } }; var updateStarted = doUpdate.Start(); run = !updateStarted; // set if we are good } else /*ELSE*/ } { } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } // shutdown Shutdown(); return; } finally { if (createdNew) { _mutex?.ReleaseMutex(); } } }
private async void App_OnStartup(object sender, StartupEventArgs e) { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ClearAllDoFiles(); // Set shutdown mode back to default ShutdownMode = ShutdownMode.OnExplicitShutdown; var isUpdater = Environment.GetCommandLineArgs().Contains("-update"); var isUpdated = Environment.GetCommandLineArgs().Contains("-updated"); #warning TRANSITIONAL CODE, REMOVE IN FUTURE VERSIONS (registry integration) if (isUpdated) { const string GUID = "8abad8e2-b957-48ed-92ba-4339c2a40e78"; const string TOSMain = "4"; const string TOS3rdParty = "4"; #if DEBUG string generalSettingsFile = GetRootPath("app/configs/General.json"); #else string generalSettingsFile = GetRootPath("configs/General.json"); #endif try { var generalSettingsText = System.IO.File.ReadAllLines(generalSettingsFile); var agreeTOS = generalSettingsText.Where(line => line.Contains("AgreedWithTOS")).FirstOrDefault(); if (agreeTOS != null) { agreeTOS = agreeTOS.Split(':') .Last() .Replace(",", "") .Trim(); if (agreeTOS == TOSMain) { SetSubKey("AgreedWithTOS", 4); } } var agreeTOSMiner = generalSettingsText.Where(line => line.Contains("Use3rdPartyMinersTOS")).FirstOrDefault(); if (agreeTOSMiner != null) { agreeTOSMiner = agreeTOSMiner.Split(':') .Last() .Replace(",", "") .Trim(); if (agreeTOSMiner == TOS3rdParty) { SetSubKey("Use3rdPartyMinersTOS", 4); } } } catch (Exception ex) { //Logger.Error("NHMLauncher", ex.Message); } } var afterUpdate = false; if (isUpdater) { var latestUpdaterFile = GetLatestUpdater(); if (latestUpdaterFile == null) { var restartProcessUpdatefailed = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updateFailed", WindowStyle = ProcessWindowStyle.Normal } }; restartProcessUpdatefailed.Start(); // shutdown Shutdown(); return; } var updaterFile = GetRootPath("updaters", latestUpdaterFile); var isZip = updaterFile.EndsWith(".zip"); //await Task.Delay(5000); if (isZip) { var pluginPackagesPath = GetRootPath("plugins_packages"); if (Directory.Exists(pluginPackagesPath)) { Directory.Delete(pluginPackagesPath, true); } var progWindow = new UpdateProgress(); progWindow.Show(); var isOk = await UnzipFileAsync(updaterFile, GetRootPath(), progWindow.Progress, CancellationToken.None); progWindow.Close(); await Task.Delay(500); // TODO if something goes wrong just restore the current exe process file var restartProcess = new Process { StartInfo = new ProcessStartInfo { FileName = GetRootPath("NiceHashMiner.exe"), WorkingDirectory = GetRootPath(), Arguments = "-updated", WindowStyle = ProcessWindowStyle.Normal } }; afterUpdate = true; restartProcess.Start(); } else { var startUpdater = new Process { StartInfo = new ProcessStartInfo { FileName = updaterFile, WorkingDirectory = GetRootPath(), WindowStyle = ProcessWindowStyle.Normal } }; startUpdater.Start(); // TODO we should wait and check if we have restarted NiceHash Miner } // shutdown Shutdown(); return; } if (isUpdated) { await Task.Delay(500); // so we release the temp files } await WindowsUptimeCheck.DelayUptime(); bool createdNew = false; try { string appPath = GetHashString(); _mutex = new Mutex(true, appPath, out createdNew); if (!createdNew) { //MessageBox.Show("We have detected you are already running NiceHash Miner. Only a single instance should be running at a time.", "NiceHash Miner Warning", MessageBoxButton.OK, MessageBoxImage.Warning); // shutdown Shutdown(); return; } ClearAllTmpFiles(); // TODO pass parent process PID var(latestAppDir, latestAppExe, version) = GetLatestApp(); #if DELETE_NON_CURRENT_APPS #error "Comment this line if you really wish to execute apps cleanup" DeleteAllExceptCurrentVersion(version); // cleanup on next release #endif var nhmApp = GetRootPath(latestAppDir, latestAppExe); var args = $"-lc -PID{Process.GetCurrentProcess().Id}"; if (isUpdated) { afterUpdate = true; args += " -updated"; } var startInfo = new ProcessStartInfo { FileName = nhmApp, Arguments = args, WindowStyle = ProcessWindowStyle.Normal }; var run = true; const int maxRestartCount = 3; int restartCount = 0; const int minRestartTimeInSeconds = 30; while (run) { var startTime = DateTime.UtcNow; run = false; try { using (var niceHashMiner = new Process { StartInfo = startInfo }) { var hasStarted = niceHashMiner?.Start(); niceHashMiner?.WaitForExit(); if (afterUpdate == true) { afterUpdate = false; startInfo.Arguments = startInfo.Arguments.Replace("-updated", ""); } // TODO Console.WriteLine(niceHashMiner.ExitCode); //in case of crash try to restart the program if (niceHashMiner.ExitCode != 0) { var endTime = DateTime.UtcNow; string path = GetRootPath("logs", "watchdogLog.txt"); if (!File.Exists(path)) { using (var sw = File.CreateText(path)) { sw.WriteLine($"Exit code: {niceHashMiner.ExitCode} ---- {endTime}"); } } else { using (var sw = File.AppendText(path)) { sw.WriteLine($"Exit code: {niceHashMiner.ExitCode} ---- {endTime}"); } } //try to re-run the NHM run = true; //check if too many restarts var elapsedSeconds = (endTime - startTime).TotalSeconds; if (elapsedSeconds < minRestartTimeInSeconds) { restartCount++; } else { restartCount = 0; } if (restartCount >= maxRestartCount) { using (var sw = File.AppendText(path)) { sw.WriteLine($"Too many restarts! Closing nhm"); } MessageBox.Show("NHM experienced too many crashes recently, therefore it will close itself", "Too many restarts"); run = false; } } else { // if exit code is 0 then check runasadmin or restart if (IsRunAsAdmin()) { RunAsAdmin.SelfElevate(); } else if (IsRestart()) { ClearAllDoFiles(); run = true; } else if (IsUpdate()) { run = true; // mark to false if updating doesn't fail ClearAllDoFiles(); var exePath = Assembly.GetExecutingAssembly().Location; var randomPart = DateTime.UtcNow.Millisecond; var tmpLauncher = GetRootPath($"tmp.nhm_updater_{randomPart}.exe"); File.Copy(exePath, tmpLauncher, true); var doUpdate = new Process { StartInfo = new ProcessStartInfo { FileName = tmpLauncher, Arguments = "-update", WindowStyle = ProcessWindowStyle.Normal } }; afterUpdate = true; var updateStarted = doUpdate.Start(); run = !updateStarted; // set if we are good } else /*ELSE*/ } { } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } // shutdown Shutdown(); return; } finally { if (createdNew) { _mutex?.ReleaseMutex(); } } }