private static void statusService(Service_T S, StringBuilder B, MonitLevelType L, int V)
        {
            var serviceXmlBuilder = new OutputBuilder(Resources.ServiceXml);

            var timeval    = S.collected;
            var headString = new StringBuilder();

            if (V == 2)
            {
                headString.AppendFormat("<service name=\"{0}\"><type>{1}</type>", S.name, (int)S.type);
            }
            else
            {
                headString.AppendFormat("<service type=\"{0}\"><name>{1}</name>", (int)S.type, S.name);
            }

            var everyString = new StringBuilder();

            if (S.every.type != MonitEveryType.Every_Cycle)
            {
                everyString.AppendFormat("<every><type>{0}</type>", (int)S.every.type);
                if (S.every.type == MonitEveryType.Every_SkipCycles)
                {
                    var cycle = S.every as CycleEvery_T;
                    everyString.AppendFormat("<counter>{0}</counter><number>{1}</number>", cycle.counter, cycle.number);
                }
                else
                {
                    var cron = S.every as CronEvery_T;
                    everyString.AppendFormat("<cron>{0}</cron>", cron.cron);
                }
                everyString.Append("</every>");
            }

            var centerString = new StringBuilder();

            if (L == MonitLevelType.Level_Full)
            {
                if (Util.HasServiceStatus(S))
                {
                    switch (S.type)
                    {
                    case MonitServiceType.Service_File:
                        var file = S.inf as FileInfo_T;
                        //centerString.AppendFormat(@"<mode>%o</mode>"
                        //        "<uid>%d</uid>"
                        //        "<gid>%d</gid>"
                        //        "<timestamp>%lld</timestamp>"
                        //        "<size>%llu</size>",
                        //        file.mode & 07777,
                        //        (int)file.uid,
                        //        (int)file.gid,
                        //        (long long)file.timestamp,
                        //        (unsigned long long)file.size);
                        //if (S.checksum)
                        //        centerString.AppendFormat(B, "<checksum type=\"%s\">%s</checksum>", checksumnames[S.checksum.type], file.cs_sum);
                        break;

                    case MonitServiceType.Service_Directory:
                        var directory = S.inf as DirectoryInfo_T;
                        //centerString.AppendFormat(@"<mode>%o</mode>"
                        //        "<uid>%d</uid>"
                        //        "<gid>%d</gid>"
                        //        "<timestamp>%lld</timestamp>",
                        //        directory.mode & 07777,
                        //        (int)directory.uid,
                        //        (int)directory.gid,
                        //        (long long)directory.timestamp);
                        break;

                    case MonitServiceType.Service_Fifo:
                        var fifo = S.inf as FiFoInfo_T;
                        //centerString.AppendFormat(@"<mode>%o</mode>"
                        //        "<uid>%d</uid>"
                        //        "<gid>%d</gid>"
                        //        "<timestamp>%lld</timestamp>",
                        //        fifo.mode & 07777,
                        //        (int)fifo.uid,
                        //        (int)fifo.gid,
                        //        (long long)fifo.timestamp);
                        break;

                    case MonitServiceType.Service_Filesystem:
                        var filesystem = S.inf as FileSystemInfo_T;
                        centerString.AppendFormat(
                            "<mode>{0}</mode><uid>{1}</uid><gid>{2}</gid><flags>{3}</flags><block><percent>{4}</percent><usage>{5}</usage><total>{6}</total></block>",
                            filesystem.mode,
                            filesystem.uid,
                            filesystem.gid,
                            filesystem.flags,
                            filesystem.space_percent,
                            filesystem.f_bsize > 0 ? filesystem.space_total / 1048576.0 * filesystem.f_bsize : 0,
                            filesystem.f_bsize > 0 ? filesystem.f_blocks / 1048576.0 * filesystem.f_bsize : 0);
                        if (filesystem.f_files > 0)
                        {
                            centerString.AppendFormat(
                                "<inode><percent>{0}</percent><usage>{1}</usage><total>{2}</total></inode>",
                                filesystem.inode_percent,
                                filesystem.inode_total,
                                filesystem.f_files);
                        }
                        break;

                    case MonitServiceType.Service_Net:
                        var net = S.inf as NetInfo_T;
                        //centerString.AppendFormat(@"<link>"
                        //        "<state>%d</state>"
                        //        "<speed>%lld</speed>"
                        //        "<duplex>%d</duplex>"
                        //        "<download>"
                        //        "<packets>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</packets>"
                        //        "<bytes>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</bytes>"
                        //        "<errors>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</errors>"
                        //        "</download>"
                        //        "<upload>"
                        //        "<packets>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</packets>"
                        //        "<bytes>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</bytes>"
                        //        "<errors>"
                        //        "<now>%lld</now>"
                        //        "<total>%lld</total>"
                        //        "</errors>"
                        //        "</upload>"
                        //        "</link>",
                        //        Link_getState(net.stats),
                        //        Link_getSpeed(net.stats),
                        //        Link_getDuplex(net.stats),
                        //        Link_getPacketsInPerSecond(net.stats),
                        //        Link_getPacketsInTotal(net.stats),
                        //        Link_getBytesInPerSecond(net.stats),
                        //        Link_getBytesInTotal(net.stats),
                        //        Link_getErrorsInPerSecond(net.stats),
                        //        Link_getErrorsInTotal(net.stats),
                        //        Link_getPacketsOutPerSecond(net.stats),
                        //        Link_getPacketsOutTotal(net.stats),
                        //        Link_getBytesOutPerSecond(net.stats),
                        //        Link_getBytesOutTotal(net.stats),
                        //        Link_getErrorsOutPerSecond(net.stats),
                        //        Link_getErrorsOutTotal(net.stats));
                        break;

                    case MonitServiceType.Service_Process:
                        var process = S.inf as ProcessInfo_T;
                        centerString.AppendFormat(
                            "<pid>{0}</pid><ppid>{1}</ppid><uid>{2}</uid><euid>{3}</euid><gid>{4}</gid><uptime>{5}</uptime>",
                            process.pid,
                            process.ppid,
                            process.uid,
                            process.euid,
                            process.gid,
                            process.uptime);
                        if (MonitWindowsAgent.Run.doprocess)
                        {
                            centerString.AppendFormat(
                                "<children>{0}</children><memory><percent>{1}</percent><percenttotal>{2}</percenttotal><kilobyte>{3}</kilobyte><kilobytetotal>{4}</kilobytetotal></memory><cpu><percent>{5}</percent><percenttotal>{6}</percenttotal></cpu>",
                                process.children,
                                process.mem_percent,
                                process.total_mem_percent,
                                process.mem_kbyte,
                                process.total_mem_kbyte,
                                process.cpu_percent,
                                process.total_cpu_percent);
                        }
                        break;

                    default:
                        break;
                    }
                    //for (Icmp_T i = S.icmplist; i; i = i.next) {
                    //        centerString.AppendFormat(@"<icmp>"
                    //                            "<type>%s</type>"
                    //                            "<responsetime>%.3f</responsetime>"
                    //                            "</icmp>",
                    //                            icmpnames[i.type],
                    //                            i.is_available ? i.response : -1.);
                    //}
                    //for (Port_T p = S.portlist; p; p = p.next) {
                    //        centerString.AppendFormat(@"<port>"
                    //                            "<hostname>%s</hostname>"
                    //                            "<portnumber>%d</portnumber>"
                    //                            "<request><![CDATA[%s]]></request>"
                    //                            "<protocol>%s</protocol>"
                    //                            "<type>%s</type>"
                    //                            "<responsetime>%.3f</responsetime>"
                    //                            "</port>",
                    //                            p.hostname ? p.hostname : "",
                    //                            p.port,
                    //                            p.request ? p.request : "",
                    //                            p.protocol.name ? p.protocol.name : "",
                    //                            Util_portTypeDescription(p),
                    //                            p.is_available ? p.response : -1.);
                    //}
                    //for (Port_T p = S.socketlist; p; p = p.next) {
                    //        centerString.AppendFormat(@"<unix>"
                    //                            "<path>%s</path>"
                    //                            "<protocol>%s</protocol>"
                    //                            "<responsetime>%.3f</responsetime>"
                    //                            "</unix>",
                    //                            p.pathname ? p.pathname : "",
                    //                            p.protocol.name ? p.protocol.name : "",
                    //                            p.is_available ? p.response : -1.);
                    //}
                    if (S.type == MonitServiceType.Service_System && MonitWindowsAgent.Run.doprocess)
                    {
                        centerString.AppendFormat(
                            "<system><load><avg01>{0}</avg01><avg05>{1}</avg05><avg15>{2}</avg15></load><cpu><user>{3}</user><system>{4}</system></cpu><memory><percent>{5}</percent><kilobyte>{6}</kilobyte></memory><swap><percent>{7}</percent><kilobyte>{8}</kilobyte></swap></system>",
                            MonitWindowsAgent.systeminfo.loadavg[0],
                            MonitWindowsAgent.systeminfo.loadavg[1],
                            MonitWindowsAgent.systeminfo.loadavg[2],
                            MonitWindowsAgent.systeminfo.total_cpu_user_percent > 0
                                ? MonitWindowsAgent.systeminfo.total_cpu_user_percent
                                : 0,
                            MonitWindowsAgent.systeminfo.total_cpu_syst_percent > 0
                                ? MonitWindowsAgent.systeminfo.total_cpu_syst_percent
                                : 0,
                            MonitWindowsAgent.systeminfo.total_mem_percent,
                            MonitWindowsAgent.systeminfo.total_mem_kbyte,
                            MonitWindowsAgent.systeminfo.total_swap_percent,
                            MonitWindowsAgent.systeminfo.total_swap_kbyte);
                    }
                    if (S.type == MonitServiceType.Service_Program && S.program.started != null)
                    {
                        centerString.AppendFormat(
                            "<program><started>{0}</started><status>{1}</status><output><![CDATA[",
                            Timing.GetTimestamp(S.program.started),
                            S.program.exitStatus);
                        centerString.Append(_escapeCDATA(S.program.output.ToString()));
                        centerString.Append("]]></output></program>");
                    }
                }
            }

            serviceXmlBuilder.ReplaceAllTags(headString.ToString(), Timing.GetTimestamp(timeval),
                                             Timing.GetUsec(timeval), S.error, S.error_hint, (int)S.monitor, (int)S.mode, (int)S.doaction,
                                             everyString.ToString(), centerString.ToString());
            B.Append(serviceXmlBuilder.GetResult());
        }
        public static string StatusXml(Event_T E, MonitLevelType L, int V, string myip)
        {
            var centerString = new StringBuilder();

            if (V == 2)
            {
                centerString.Append("<services>");
            }
            foreach (var S in MonitWindowsAgent.servicelist_conf)
            {
                statusService(S, centerString, L, V);
            }
            if (V == 2)
            {
                centerString.Append("</services><servicegroups>");
                foreach (var SG in MonitWindowsAgent.servicegrouplist)
                {
                    var serviceGroupXmlBuilder = new OutputBuilder(Resources.ServiceGroupXml);
                    var serviceGroupString     = new StringBuilder();
                    foreach (var sgm in SG.members)
                    {
                        serviceGroupString.AppendFormat("<service>{0}</service>", sgm.name);
                    }
                    serviceGroupXmlBuilder.ReplaceAllTags(SG.name, serviceGroupString.ToString());
                    centerString.Append(serviceGroupXmlBuilder.GetResult());
                }
                centerString.Append("</servicegroups>");
            }
            if (E != null)
            {
                var eventXmlBuilder = new OutputBuilder(Resources.EventXml);
                var timeval         = E.collected;
                var source          = Event.GetSource(E);
                eventXmlBuilder.ReplaceAllTags(Timing.GetTimestamp(timeval), Timing.GetUsec(timeval),
                                               E.id == MonitEventType.Event_Instance ? "Monit" : E.source, (int)E.type, (int)E.id, (int)E.state,
                                               (int)Event.GetAction(E), _escapeCDATA(E.message),
                                               (source != null && !string.IsNullOrEmpty(source.token))
                        ? string.Format("<token>{0}</token>", source.token)
                        : "");
                centerString.Append(eventXmlBuilder.GetResult());
            }

            var headerFooterXmlBuilder = new OutputBuilder(Resources.HeaderFooterXml);
            var run        = MonitWindowsAgent.Run;
            var systemInfo = MonitWindowsAgent.systeminfo;
            var headString = new StringBuilder();

            if (V == 2)
            {
                headString.AppendFormat("<monit id=\"{0}\" incarnation=\"{1}\" version=\"{2}\"><server>", run.id,
                                        Timing.GetTimestamp(run.incarnation), MonitWindowsAgent.VERSION);
            }
            else
            {
                headString.AppendFormat(
                    "<monit><server><id>{0}</id><incarnation>{1}</incarnation><version>{2}</version>", run.id,
                    Timing.GetTimestamp(run.incarnation), MonitWindowsAgent.VERSION);
            }

            var httpdBuilder = new StringBuilder();

            if (MonitWindowsAgent.Run.httpd != null)
            {
                var httpd = MonitWindowsAgent.Run.httpd;
                httpdBuilder.AppendFormat("<httpd><address>{0}</address><port>{1}</port><ssl>{2}</ssl></httpd>",
                                          httpd.address, httpd.port, httpd.ssl ? "1" : "0");
                if (httpd.credentials != null && httpd.credentials.Count > 0)
                {
                    httpdBuilder.AppendFormat(
                        "<credentials><username>{0}</username><password>{1}</password></credentials>",
                        httpd.credentials[0].uname, httpd.credentials[0].passwd);
                }
            }

            headerFooterXmlBuilder.ReplaceAllTags(headString.ToString(), "5", run.polltime, run.startdelay,
                                                  run.system[0].name, run.controlfile, httpdBuilder.ToString(), systemInfo.uname.sysname,
                                                  systemInfo.uname.release, systemInfo.uname.version, systemInfo.uname.machine, systemInfo.cpus,
                                                  systemInfo.mem_kbyte_max, systemInfo.swap_kbyte_max, centerString.ToString());
            return(headerFooterXmlBuilder.GetResult());
        }