private void Act_StartPingInSelectedItens() { foreach (DataGridViewRow row in dataGridView.SelectedRows) { string host = row.Cells["Host"].Value.ToString(); pinger.BeginStart(host, row); } }
private void Act_InstallUpdatesBatchExecutor(object rowObject) { bool isRebootRequired = false; DateTime lastReboot = new DateTime(); DataGridViewRow row = (DataGridViewRow)rowObject; string host = row.Cells["Host"].Value.ToString(); string operResult = string.Empty; Stopwatch sw = new Stopwatch(); sw.Start(); try { int minutesRebootLastRebootCheck = (int)numUpDownMinutesReboot.Value; int rebootCheckAttempts = (int)numUpDownAttemptsNumber.Value; // Failover Cluster Services if (chkBoxCluster.Checked) { DgvUtils.SetRowValue(ref row, WUCollums.BatchStep, "Moving_ClusterResources (1/5)"); osManager.StartHostReadiness(host, ref row, chkBoxClusterResources.Checked); bool isClustered = Convert.ToBoolean(DgvUtils.GetRowValue(ref row, WUCollums.Cluster)); if (isClustered) { DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, "Executing remote powershell to move resources..."); osManager.FailOverClusterNode(host); } } // Install Updates DgvUtils.SetRowStyleForeColor(ref row, WUCollums.Status, Color.Black); DgvUtils.SetRowValue(ref row, WUCollums.BatchStep, "Inst_Updates (2/5)"); Act_InstallUpdatesExecutor(row); //On error it stops the batch CheckBatchExecutionErrors(row); isRebootRequired = Convert.ToBoolean(DgvUtils.GetRowValue(ref row, WUCollums.RebootRequired)); int updatesInstalled = Convert.ToInt32(DgvUtils.GetRowValue(ref row, WUCollums.Updates)); // Reboot DgvUtils.SetRowValue(ref row, WUCollums.BatchStep, "Rebooting (3/5)"); if (isRebootRequired) { int attempts = 0; string errorRebootMessage = string.Empty; osManager.StartReboot(host, ref row); pinger.BeginStart(host, row); // Testing server when it comes online do { //Wait 30 seconds Thread.Sleep(30000); if (attempts <= rebootCheckAttempts) { try { lastReboot = osManager.GetLastBootDateTimeObject(host, ref row); DgvUtils.SetRowValue(ref row, WUCollums.LastBoot, string.Empty); DgvUtils.SetRowValue(ref row, WUCollums.LastBoot, lastReboot.ToString("dd/MM/yyyy HH:mm")); } catch { // returns a generic date just to keep the execution lastReboot = new DateTime(2000, 1, 1); } } else { errorRebootMessage = $"Number of attempts has been reached"; break; } attempts++; DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, $"Host has not completed the reboot yet...(attempt: {attempts})"); // Check if the last boot time attribute } while ((int)(DateTime.Now - lastReboot).TotalMinutes >= minutesRebootLastRebootCheck); // Stop the execution when it has reached the attempts limit if (!string.IsNullOrEmpty(errorRebootMessage)) { throw new Exception(errorRebootMessage); } DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, "Server Online"); pinger.BeginStop(row); osManager.StartHostReadiness(host, ref row, chkBoxClusterResources.Checked); } else { DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, "Reboot not required"); } // Count Updates if (updatesInstalled != 0) { DgvUtils.SetRowValue(ref row, WUCollums.BatchStep, "Count_Updates (4/5)"); // Give more time to rpc services start Thread.Sleep(40000); Act_CountUpdatesExecutor(row); //On error it stops the batch CheckBatchExecutionErrors(row); } DgvUtils.SetRowValue(ref row, WUCollums.BatchStep, "Finished (5/5)"); } catch (Exception ex) { DgvUtils.SetRowValue(ref row, WUCollums.Status, "ThreadError"); DgvUtils.SetRowStyleForeColor(ref row, WUCollums.Status, Color.Red); DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, ex.Message); } finally { sw.Stop(); operResult = DgvUtils.GetRowValue(ref row, WUCollums.OperationResults).ToString(); DgvUtils.SetRowValue(ref row, WUCollums.OperationResults, string.Format("Duration: {0} min {1}", (int)sw.Elapsed.Duration().TotalMinutes, operResult)); if (semaphore.Release() == (int)numUpDownTreads.Value) { semaphore.Dispose(); } this.Sys_RemoveThreadRow(ref row); } }