Example #1
0
        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);
        }
Example #3
0
        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);
        }