protected override void Run() { int n = hosts.Count; 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"); // Copy client logs string logDestination = string.Format("{0}\\{1}-{2}", filepath, timestring, InvisibleMessages.LOG_FILENAME); if (entries.Contains("client-logs")) { if (File.Exists(logDestination)) File.Delete(logDestination); string logPath = XenAdminConfigManager.Provider.GetLogFile(); File.Copy(logPath, logDestination); // Copy old XenCenter.log.* files too DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(logPath)); Regex regex = new Regex(Regex.Escape(Path.GetFileName(logPath)) + @"\.\d+"); foreach (FileInfo file in di.GetFiles()) { if (regex.IsMatch(file.Name)) File.Copy(file.FullName, Path.Combine(filepath, timestring + "-" + file.Name)); } } // collect all master/slave information to output as a separate text file with the report List<string> mastersInfo = new List<string>(); int completedActions = hosts.Count; int i = 0; foreach (HostWithStatus host in hosts) { Description = string.Format(Messages.ACTION_SYSTEM_STATUS_DESCRIPTION, host.Host.Name); Pool = Helpers.GetPoolOfOne(host.Host.Connection); // master/slave information XenAPI.Pool p = Helpers.GetPool(host.Host.Connection); if (p == null) { mastersInfo.Add(string.Format("Server '{0}' is a stand alone server", host.Host.Name)); } else { mastersInfo.Add(string.Format("Server '{0}' is a {1} of pool '{2}'", host.Host.Name, p.master.opaque_ref == host.Host.opaque_ref ? "master" : "slave", p.Name)); } // Ensure downloaded filenames are unique even for hosts with the same hostname: append a counter to the timestring SingleHostStatusAction action = new SingleHostStatusAction(host, entries, filepath, timestring + "-" + ++i); actions.Add(action); action.Changed += (Action<ActionBase>)delegate { int total = 0; foreach (SingleHostStatusAction a in actions) { total += a.PercentComplete; } PercentComplete = (int)(total / n); }; action.Completed += (Action<ActionBase>)delegate { lock (completeActionsMonitor) { completedActions--; Monitor.PulseAll(completeActionsMonitor); } }; action.RunAsync(); } // output the slave/master info while we wait 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(); } // now wait for the status actions to return lock (completeActionsMonitor) while (completedActions > 0 && !Cancelling) Monitor.Wait(completeActionsMonitor); if (Cancelling) throw new CancelledException(); int failedHosts = 0; foreach (HostWithStatus h in hosts) { if (h.Status == HostStatus.failed) failedHosts++; else SomethingToSave = true; } Result = filepath; if (Cancelling || Cancelled) Description = Messages.ACTION_SYSTEM_STATUS_CANCELLED; else if (failedHosts > 0) { if (failedHosts == hosts.Count) { if (entries.Contains("client-logs")) { SomethingToSave = true; Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL_WITH_ERRORS_XCLOGS; } else Description = Messages.ACTION_SYSTEM_STATUS_NONE_SUCCEEDED; } else Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL_WITH_ERROR; } else Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL; }
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); } 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); }
protected override void Run() { int n = hosts.Count; 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"); // Copy client logs string logDestination = string.Format("{0}\\{1}-{2}", filepath, timestring, InvisibleMessages.LOG_FILENAME); if (entries.Contains("client-logs")) { if (File.Exists(logDestination)) { File.Delete(logDestination); } string logPath = XenAdminConfigManager.Provider.GetLogFile(); File.Copy(logPath, logDestination); // Copy old XenCenter.log.* files too DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(logPath)); Regex regex = new Regex(Regex.Escape(Path.GetFileName(logPath)) + @"\.\d+"); foreach (FileInfo file in di.GetFiles()) { if (regex.IsMatch(file.Name)) { File.Copy(file.FullName, Path.Combine(filepath, timestring + "-" + file.Name)); } } } // collect all master/slave information to output as a separate text file with the report List <string> mastersInfo = new List <string>(); int completedActions = hosts.Count; int i = 0; foreach (HostWithStatus host in hosts) { Description = string.Format(Messages.ACTION_SYSTEM_STATUS_DESCRIPTION, host.Host.Name); Pool = Helpers.GetPoolOfOne(host.Host.Connection); // master/slave information XenAPI.Pool p = Helpers.GetPool(host.Host.Connection); if (p == null) { mastersInfo.Add(string.Format("Server '{0}' is a stand alone server", host.Host.Name)); } else { mastersInfo.Add(string.Format("Server '{0}' is a {1} of pool '{2}'", host.Host.Name, p.master.opaque_ref == host.Host.opaque_ref ? "master" : "slave", p.Name)); } // Ensure downloaded filenames are unique even for hosts with the same hostname: append a counter to the timestring SingleHostStatusAction action = new SingleHostStatusAction(host, entries, filepath, timestring + "-" + ++i); actions.Add(action); action.Changed += (Action <ActionBase>) delegate { int total = 0; foreach (SingleHostStatusAction a in actions) { total += a.PercentComplete; } PercentComplete = (int)(total / n); }; action.Completed += (Action <ActionBase>) delegate { lock (completeActionsMonitor) { completedActions--; Monitor.PulseAll(completeActionsMonitor); } }; action.RunAsync(); } // output the slave/master info while we wait string mastersDestination = string.Format("{0}\\{1}-Masters.txt", filepath, timestring); WriteExtraInfoToFile(mastersInfo, mastersDestination); // output the XenCenter metadata var metadata = XenAdminConfigManager.Provider.GetXenCenterMetadata(true); string metadataDestination = string.Format("{0}\\{1}-Metadata.json", filepath, timestring); WriteExtraInfoToFile(new List <string> { metadata }, metadataDestination); // now wait for the status actions to return lock (completeActionsMonitor) while (completedActions > 0 && !Cancelling) { Monitor.Wait(completeActionsMonitor); } if (Cancelling) { throw new CancelledException(); } int failedHosts = 0; foreach (HostWithStatus h in hosts) { if (h.Status == HostStatus.failed) { failedHosts++; } else { SomethingToSave = true; } } Result = filepath; if (Cancelling || Cancelled) { Description = Messages.ACTION_SYSTEM_STATUS_CANCELLED; } else if (failedHosts > 0) { if (failedHosts == hosts.Count) { if (entries.Contains("client-logs")) { SomethingToSave = true; Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL_WITH_ERRORS_XCLOGS; } else { Description = Messages.ACTION_SYSTEM_STATUS_NONE_SUCCEEDED; } } else { Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL_WITH_ERROR; } } else { Description = Messages.ACTION_SYSTEM_STATUS_SUCCESSFUL; } }
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); }