public void RunBugtool(IXenConnection connection, Session session) { if (connection == null || session == null) { return; } // Fetch the common capabilities of all hosts. Dictionary <Host, List <string> > hostCapabilities = new Dictionary <Host, List <string> >(); foreach (Host host in connection.Cache.Hosts) { GetSystemStatusCapabilities action = new GetSystemStatusCapabilities(host); action.RunExternal(session); if (!action.Succeeded) { return; } List <string> keys = new List <string>(); XmlDocument doc = new XmlDocument(); doc.LoadXml(action.Result); foreach (XmlNode node in doc.GetElementsByTagName("capability")) { foreach (XmlAttribute a in node.Attributes) { if (a.Name == "key") { keys.Add(a.Value); } } } hostCapabilities[host] = keys; } List <string> combination = null; foreach (List <string> capabilities in hostCapabilities.Values) { if (capabilities == null) { continue; } if (combination == null) { combination = capabilities; continue; } combination = Helpers.ListsCommonItems <string>(combination, capabilities); } if (combination == null || combination.Count <= 0) { return; } // The list of the reports which are required in Health Check Report. List <string> reportIncluded = combination.Except(reportExcluded).ToList(); // Verbosity works for xen-bugtool since Dundee. if (Helpers.DundeeOrGreater(connection)) { List <string> verbReport = new List <string>(reportWithVerbosity.Keys); int idx = -1; for (int x = 0; x < verbReport.Count; x++) { idx = reportIncluded.IndexOf(verbReport[x]); if (idx >= 0) { reportIncluded[idx] = reportIncluded[idx] + ":" + reportWithVerbosity[verbReport[x]].ToString(); } } } // Ensure downloaded filenames are unique even for hosts with the same hostname: append a counter to the timestring string filepath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); if (Directory.Exists(filepath)) { Directory.Delete(filepath); } Directory.CreateDirectory(filepath); string timestring = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"); // Collect all master/slave information to output as a separate text file with the report List <string> mastersInfo = new List <string>(); int i = 0; Pool p = Helpers.GetPool(connection); foreach (Host host in connection.Cache.Hosts) { // master/slave information if (p == null) { mastersInfo.Add(string.Format("Server '{0}' is a stand alone server", host.Name)); } else { mastersInfo.Add(string.Format("Server '{0}' is a {1} of pool '{2}'", host.Name, p.master.opaque_ref == host.opaque_ref ? "master" : "slave", p.Name)); } HostWithStatus hostWithStatus = new HostWithStatus(host, 0); SingleHostStatusAction statAction = new SingleHostStatusAction(hostWithStatus, reportIncluded, filepath, timestring + "-" + ++i); statAction.RunExternal(session); } // output the slave/master info string mastersDestination = string.Format("{0}\\{1}-Masters.txt", filepath, timestring); WriteExtraInfoToFile(mastersInfo, mastersDestination); // output the XenCenter metadata var metadata = XenAdminConfigManager.Provider.GetXenCenterMetadata(false); string metadataDestination = string.Format("{0}\\{1}-Metadata.json", filepath, timestring); WriteExtraInfoToFile(new List <string> { metadata }, metadataDestination); // Finish the collection of logs with bugtool. // Start to zip the files. ZipStatusReportAction zipAction = new ZipStatusReportAction(filepath, outputFile); zipAction.RunExternal(session); log.InfoFormat("Server Status Report is collected: {0}", outputFile); }
protected override void FinishWizard() { AsyncAction action; if (bugToolPageDestination1.Upload) { // The MultipleAction is only used as a wrapper, we will suppress its history and expose the sub-actions in the history List <AsyncAction> subActions = new List <AsyncAction>(); ZipStatusReportAction zipAction = new ZipStatusReportAction(bugToolPageRetrieveData.OutputFolder, bugToolPageDestination1.OutputFile, false); subActions.Add(zipAction); UploadServerStatusReportAction uploadAction = new UploadServerStatusReportAction(bugToolPageDestination1.OutputFile, // tmp folder bugToolPageDestination1.UploadToken, // upload token bugToolPageDestination1.CaseNumber, // case id Registry.HealthCheckUploadDomainName, // domain name false); // suppressHistory subActions.Add(uploadAction); action = new MultipleAction(null, Messages.BUGTOOL_SAVING, Messages.BUGTOOL_SAVING, Messages.COMPLETED, subActions, true); } else { action = new ZipStatusReportAction(bugToolPageRetrieveData.OutputFolder, bugToolPageDestination1.OutputFile, false); } action.RunAsync(); log.Debug("Cleaning up crash dump logs on server"); var capabilities = bugToolPageSelectCapabilities1.Capabilities; foreach (Capability c in capabilities) { if (c.Key == "host-crashdump-dumps" && c.Checked) { var hostList = bugToolPageSelectHosts1.SelectedHosts; if (!hostList.Any(h => h.HasCrashDumps())) { break; } DialogResult result; using (var dlg = new ThreeButtonDialog( new ThreeButtonDialog.Details(null, Messages.REMOVE_CRASHDUMP_QUESTION, Messages.REMOVE_CRASHDUMP_FILES), ThreeButtonDialog.ButtonYes, ThreeButtonDialog.ButtonNo)) { result = dlg.ShowDialog(this); } if (result == DialogResult.Yes) { foreach (Host host in hostList) { if (host != null && host.HasCrashDumps()) { new Actions.DestroyHostCrashDumpAction(host).RunAsync(); } } } break; } } base.FinishWizard(); }
protected override void FinishWizard() { // If the user has chosen a file that already exists, get confirmation string path = bugToolPageDestination1.OutputFile; if (File.Exists(path)) { DialogResult dialogResult; using (var dlg = new ThreeButtonDialog( new ThreeButtonDialog.Details(SystemIcons.Warning, string.Format(Messages.FILE_X_EXISTS_OVERWRITE, path), Messages.XENCENTER), ThreeButtonDialog.ButtonOK, new ThreeButtonDialog.TBDButton(Messages.CANCEL, DialogResult.Cancel, ThreeButtonDialog.ButtonType.CANCEL, true))) { dialogResult = dlg.ShowDialog(this); } if (dialogResult != DialogResult.OK) { FinishCanceled(); return; } } // Check we can write to the destination file - otherwise we only find out at the // end of the ZipStatusReportAction, and the downloaded server files are lost, // and the user will have to run the wizard again. try { using (FileStream temp = File.OpenWrite(path)) { // Yay, it worked } } catch (Exception exn) { // Failure using (var dlg = new ThreeButtonDialog( new ThreeButtonDialog.Details( SystemIcons.Error, string.Format(Messages.COULD_NOT_WRITE_FILE, path, exn.Message), Messages.XENCENTER))) { dlg.ShowDialog(this); } FinishCanceled(); return; } AsyncAction action; if (bugToolPageDestination1.Upload) { // The MultipleAction is only used as a wrapper, we will suppress its history and expose the sub-actions in the history List <AsyncAction> subActions = new List <AsyncAction>(); ZipStatusReportAction zipAction = new ZipStatusReportAction(bugToolPageRetrieveData.OutputFolder, bugToolPageDestination1.OutputFile, false); subActions.Add(zipAction); UploadServerStatusReportAction uploadAction = new UploadServerStatusReportAction(bugToolPageDestination1.OutputFile, // tmp folder bugToolPageDestination1.UploadToken, // upload token bugToolPageDestination1.CaseNumber, // case id Registry.HealthCheckUploadDomainName, // domain name false); // suppressHistory subActions.Add(uploadAction); action = new MultipleAction(null, Messages.BUGTOOL_SAVING, Messages.BUGTOOL_SAVING, Messages.COMPLETED, subActions, true); } else { action = new ZipStatusReportAction(bugToolPageRetrieveData.OutputFolder, bugToolPageDestination1.OutputFile, false); } action.RunAsync(); // Save away the output path for next time XenAdmin.Properties.Settings.Default.ServerStatusPath = bugToolPageDestination1.OutputFile; log.Debug("Cleaning up crash dump logs on server"); var capabilities = bugToolPageSelectCapabilities1.Capabilities; foreach (Capability c in capabilities) { if (c.Key == "host-crashdump-dumps" && c.Checked) { var hostList = bugToolPageSelectHosts1.SelectedHosts; if (!hostList.Any(h => h.HasCrashDumps())) { break; } DialogResult result; using (var dlg = new ThreeButtonDialog( new ThreeButtonDialog.Details(null, Messages.REMOVE_CRASHDUMP_QUESTION, Messages.REMOVE_CRASHDUMP_FILES), ThreeButtonDialog.ButtonYes, ThreeButtonDialog.ButtonNo)) { result = dlg.ShowDialog(this); } if (result == DialogResult.Yes) { foreach (Host host in hostList) { if (host != null && host.HasCrashDumps()) { new Actions.DestroyHostCrashDumpAction(host).RunAsync(); } } } break; } } base.FinishWizard(); }
public void RunBugtool(IXenConnection connection, Session session) { if (connection == null || session == null) { return; } // Ensure downloaded filenames are unique even for hosts with the same hostname: append a counter to the timestring string filepath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); if (Directory.Exists(filepath)) { Directory.Delete(filepath); } Directory.CreateDirectory(filepath); string timestring = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"); // Collect all master/slave information to output as a separate text file with the report List <string> mastersInfo = new List <string>(); int i = 0; Pool p = Helpers.GetPool(connection); foreach (Host host in connection.Cache.Hosts) { // master/slave information if (p == null) { mastersInfo.Add(string.Format("Server '{0}' is a stand alone server", host.Name)); } else { mastersInfo.Add(string.Format("Server '{0}' is a {1} of pool '{2}'", host.Name, p.master.opaque_ref == host.opaque_ref ? "master" : "slave", p.Name)); } HostWithStatus hostWithStatus = new HostWithStatus(host, 0); SingleHostStatusAction statAction = new SingleHostStatusAction(hostWithStatus, bugtoolParam, filepath, timestring + "-" + ++i); statAction.RunExternal(session); } string mastersDestination = string.Format("{0}\\{1}-Masters.txt", filepath, timestring); if (File.Exists(mastersDestination)) { File.Delete(mastersDestination); } StreamWriter sw = null; try { sw = new StreamWriter(mastersDestination); foreach (string s in mastersInfo) { sw.WriteLine(s); } sw.Flush(); } catch (Exception e) { log.ErrorFormat("Exception while writing masters file: {0}", e); } finally { if (sw != null) { sw.Close(); } } // Finish the collection of logs with bugtool. // Start to zip the files. ZipStatusReportAction zipAction = new ZipStatusReportAction(filepath, outputFile); zipAction.RunExternal(session); log.InfoFormat("Server Status Report is collected: {0}", outputFile); }