mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 23:25:38 +00:00
[master] stats improvements
3700. [func] Allow access to subgroups of XML statistics via special URLs http://<server>:<port>/xml/v3/server, /zones, /net, /tasks, /mem, and /status. [RT #35115] 3699. [bug] Improvements to statistics channel XSL stylesheet: the stylesheet can now be cached by the browser; section headers are omitted from the stats display when there is no data in those sections to be displayed; counters are now right-justified for easier readability. [RT #35117]
This commit is contained in:
11
CHANGES
11
CHANGES
@@ -1,3 +1,14 @@
|
|||||||
|
3700. [func] Allow access to subgroups of XML statistics via
|
||||||
|
special URLs http://<server>:<port>/xml/v3/server,
|
||||||
|
/zones, /net, /tasks, /mem, and /status. [RT #35115]
|
||||||
|
|
||||||
|
3699. [bug] Improvements to statistics channel XSL stylesheet:
|
||||||
|
the stylesheet can now be cached by the browser;
|
||||||
|
section headers are omitted from the stats display
|
||||||
|
when there is no data in those sections to be
|
||||||
|
displayed; counters are now right-justified for
|
||||||
|
easier readability. [RT #35117]
|
||||||
|
|
||||||
3698. [cleanup] Replaced all uses of memcpy() with memmove().
|
3698. [cleanup] Replaced all uses of memcpy() with memmove().
|
||||||
[RT #35120]
|
[RT #35120]
|
||||||
|
|
||||||
|
1302
bin/named/bind9.xsl
1302
bin/named/bind9.xsl
File diff suppressed because it is too large
Load Diff
@@ -32,53 +32,58 @@ static char xslmsg[] =
|
|||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"/>\n"
|
" <script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"/>\n"
|
||||||
" <script type=\"text/javascript\">\n"
|
" <script type=\"text/javascript\">\n"
|
||||||
" \n"
|
"\n"
|
||||||
" google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});\n"
|
" google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});\n"
|
||||||
" google.setOnLoadCallback(loadGraphs);\n"
|
" google.setOnLoadCallback(loadGraphs);\n"
|
||||||
"\n"
|
"\n"
|
||||||
" var graphs=[];\n"
|
" var graphs=[];\n"
|
||||||
" \n"
|
"\n"
|
||||||
" function drawChart(chart_title,target,data) {\n"
|
" function drawChart(chart_title,target,style,data) {\n"
|
||||||
" var data = google.visualization.arrayToDataTable(data);\n"
|
" var data = google.visualization.arrayToDataTable(data);\n"
|
||||||
"\n"
|
"\n"
|
||||||
" var options = {\n"
|
" var options = {\n"
|
||||||
" title: chart_title\n"
|
" title: chart_title\n"
|
||||||
" };\n"
|
" };\n"
|
||||||
" \n"
|
"\n"
|
||||||
" var chart = new google.visualization.BarChart(document.getElementById(target));\n"
|
" var chart;\n"
|
||||||
|
" if (style == \"barchart\") {\n"
|
||||||
|
" chart = new google.visualization.BarChart(document.getElementById(target));\n"
|
||||||
|
" chart.draw(data, options);\n"
|
||||||
|
" } else if (style == \"piechart\") {\n"
|
||||||
|
" chart = new google.visualization.PieChart(document.getElementById(target));\n"
|
||||||
" chart.draw(data, options);\n"
|
" chart.draw(data, options);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
" }\n"
|
||||||
|
"\n"
|
||||||
" function loadGraphs(){\n"
|
" function loadGraphs(){\n"
|
||||||
" //alert(\"here we are!\");\n"
|
|
||||||
" var g;\n"
|
" var g;\n"
|
||||||
" \n"
|
"\n"
|
||||||
" // Server Incoming query Types\n"
|
|
||||||
" while(g = graphs.shift()){\n"
|
" while(g = graphs.shift()){\n"
|
||||||
" // alert(\"going for: \" + g.target);\n"
|
" // alert(\"going for: \" + g.target);\n"
|
||||||
" if(g.data.length > 1){\n"
|
" if(g.data.length > 1){\n"
|
||||||
" drawChart(g.title,g.target,g.data);\n"
|
" drawChart(g.title,g.target,g.style,g.data);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
" // Server Incoming Queries Types \n"
|
" <xsl:if test=\"server/counters[@type="qtype"]/counter\">\n"
|
||||||
|
" // Server Incoming Query Types\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title' : \"Server Incoming Query Types\",\n"
|
" 'title' : \"Server Incoming Query Types\",\n"
|
||||||
" 'target': 'chart_incoming_qtypes',\n"
|
" 'target': 'chart_incoming_qtypes',\n"
|
||||||
|
" 'style': 'barchart',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="qtype"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="qtype"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"\n"
|
" <xsl:if test=\"server/counters[@type="opcode"]/counter\">\n"
|
||||||
" // Server Incoming Requests \n"
|
" // Server Incoming Requests by opcode\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title' : \"Server Incoming Requests\",\n"
|
" 'title' : \"Server Incoming Requests by DNS Opcode\",\n"
|
||||||
" 'target': 'chart_incoming_requests',\n"
|
" 'target': 'chart_incoming_opcodes',\n"
|
||||||
" 'data': [['Requests','Counter'],<xsl:for-each select=\"server/counters[@type="opcode"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]});\n"
|
" 'style': 'barchart',\n"
|
||||||
" \n"
|
" 'data': [['Opcode','Counter'],<xsl:for-each select=\"server/counters[@type="opcode"]/counter[. > 0 or substring(@name,1,3) != 'RES']\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]});\n"
|
||||||
" \n"
|
" </xsl:if>\n"
|
||||||
" \n"
|
|
||||||
" \n"
|
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <style type=\"text/css\">\n"
|
" <style type=\"text/css\">\n"
|
||||||
@@ -88,15 +93,15 @@ static char xslmsg[] =
|
|||||||
" color: #000000;\n"
|
" color: #000000;\n"
|
||||||
" font-size: 10pt;\n"
|
" font-size: 10pt;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
" .odd{\n"
|
" .odd{\n"
|
||||||
" background-color: #f0f0f0;\n"
|
" background-color: #f0f0f0;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
" .even{\n"
|
" .even{\n"
|
||||||
" background-color: #ffffff;\n"
|
" background-color: #ffffff;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
" p.footer{\n"
|
" p.footer{\n"
|
||||||
" font-style:italic;\n"
|
" font-style:italic;\n"
|
||||||
" color: grey;\n"
|
" color: grey;\n"
|
||||||
@@ -111,21 +116,101 @@ static char xslmsg[] =
|
|||||||
" border: 1px solid grey;\n"
|
" border: 1px solid grey;\n"
|
||||||
" width: 500px;\n"
|
" width: 500px;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
|
||||||
" table.counters th {\n"
|
" table.counters th {\n"
|
||||||
" text-align: center;\n"
|
" text-align: right;\n"
|
||||||
" border: 1px solid grey;\n"
|
" border: 1px solid grey;\n"
|
||||||
" width: 120px;\n"
|
" width: 150px;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" table.counters td{\n"
|
" table.counters td {\n"
|
||||||
" text-align:center;\n"
|
" text-align: right;\n"
|
||||||
" \n"
|
" font-family: monospace;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
|
||||||
" table.counters tr:hover{\n"
|
" table.counters tr:hover{\n"
|
||||||
" background-color: #99ddff;\n"
|
" background-color: #99ddff;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
|
" table.info {\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 500px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.info th {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 150px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.info td {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.info tr:hover{\n"
|
||||||
|
" background-color: #99ddff;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" table.tasks {\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 500px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.tasks th {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 150px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.tasks td {\n"
|
||||||
|
" text-align: right;\n"
|
||||||
|
" font-family: monospace;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.tasks td:nth-child(2) {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.tasks td:nth-child(4) {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.tasks tr:hover{\n"
|
||||||
|
" background-color: #99ddff;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" table.netstat {\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 500px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.netstat th {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 150px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.netstat td {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.netstat td:nth-child(4) {\n"
|
||||||
|
" text-align: right;\n"
|
||||||
|
" font-family: monospace;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.netstat td:nth-child(7) {\n"
|
||||||
|
" text-align: left;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.netstat tr:hover{\n"
|
||||||
|
" background-color: #99ddff;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
" table.mctx {\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" width: 500px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.mctx th {\n"
|
||||||
|
" text-align: center;\n"
|
||||||
|
" border: 1px solid grey;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.mctx td {\n"
|
||||||
|
" text-align: right;\n"
|
||||||
|
" font-family: monospace;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.mctx td:nth-child(-n+2) {\n"
|
||||||
|
" text-align: left;\n"
|
||||||
|
" width: 100px;\n"
|
||||||
|
" }\n"
|
||||||
|
" table.mctx tr:hover{\n"
|
||||||
|
" background-color: #99ddff;\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
" .totals {\n"
|
" .totals {\n"
|
||||||
" background-color: rgb(1,169,206);\n"
|
" background-color: rgb(1,169,206);\n"
|
||||||
" color: #ffffff;\n"
|
" color: #ffffff;\n"
|
||||||
@@ -165,20 +250,18 @@ static char xslmsg[] =
|
|||||||
" width:500px;\n"
|
" width:500px;\n"
|
||||||
" text-align:center;\n"
|
" text-align:center;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" \n"
|
"\n"
|
||||||
" h3 {\n"
|
" h3 {\n"
|
||||||
" color: #444444;\n"
|
" color: #444444;\n"
|
||||||
" font-size: 12pt;\n"
|
" font-size: 12pt;\n"
|
||||||
" width:500px;\n"
|
" width:500px;\n"
|
||||||
" text-align:center;\n"
|
" text-align:center;\n"
|
||||||
" \n"
|
|
||||||
" }\n"
|
" }\n"
|
||||||
" h4 {\n"
|
" h4 {\n"
|
||||||
" color: rgb(1,169,206);\n"
|
" color: rgb(1,169,206);\n"
|
||||||
" font-size: 10pt;\n"
|
" font-size: 10pt;\n"
|
||||||
" width:500px;\n"
|
" width:500px;\n"
|
||||||
" text-align:center;\n"
|
" text-align:center;\n"
|
||||||
" \n"
|
|
||||||
" }\n"
|
" }\n"
|
||||||
"\n"
|
"\n"
|
||||||
" .pie {\n"
|
" .pie {\n"
|
||||||
@@ -194,8 +277,8 @@ static char xslmsg[] =
|
|||||||
" <h1>ISC Bind 9 Configuration and Statistics</h1>\n"
|
" <h1>ISC Bind 9 Configuration and Statistics</h1>\n"
|
||||||
" </div>\n"
|
" </div>\n"
|
||||||
" <hr/>\n"
|
" <hr/>\n"
|
||||||
" <h2>Server Times</h2>\n"
|
" <h2>Server Status</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"info\">\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
" <th>Boot time:</th>\n"
|
" <th>Boot time:</th>\n"
|
||||||
" <td>\n"
|
" <td>\n"
|
||||||
@@ -216,13 +299,16 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
" <h2>Incoming Requests</h2>\n"
|
" <xsl:if test=\"server/counters[@type="opcode"]/counter[. > 0]\">\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
|
" <h2>Incoming Requests by DNS Opcode</h2>\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <div class=\"pie\" id=\"chart_incoming_requests\">[no incoming requests]</div>\n"
|
" <div class=\"pie\" id=\"chart_incoming_opcodes\">\n"
|
||||||
|
" [cannot display chart]\n"
|
||||||
|
" </div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="opcode"]/counter\">\n"
|
" <xsl:for-each select=\"server/counters[@type="opcode"]/counter[. > 0 or substring(@name,1,3) != 'RES']\">\n"
|
||||||
" <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
|
" <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
" <th>\n"
|
" <th>\n"
|
||||||
@@ -241,10 +327,14 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
" <h3>Incoming Queries by Type</h3>\n"
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"server/counters[@type="qtype"]/counter\">\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <div class=\"pie\" id=\"chart_incoming_qtypes\">[no incoming queries]</div>\n"
|
" <h3>Incoming Queries by Query Type</h3>\n"
|
||||||
|
" <div class=\"pie\" id=\"chart_incoming_qtypes\">\n"
|
||||||
|
" [cannot display chart]\n"
|
||||||
|
" </div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="qtype"]/counter\">\n"
|
" <xsl:for-each select=\"server/counters[@type="qtype"]/counter\">\n"
|
||||||
@@ -272,6 +362,8 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"views/view[count(counters[@type="resqtype"]/counter) > 0]\">\n"
|
||||||
" <h2>Outgoing Queries per view</h2>\n"
|
" <h2>Outgoing Queries per view</h2>\n"
|
||||||
" <xsl:for-each select=\"views/view[count(counters[@type="resqtype"]/counter) > 0]\">\n"
|
" <xsl:for-each select=\"views/view[count(counters[@type="resqtype"]/counter) > 0]\">\n"
|
||||||
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
@@ -279,16 +371,16 @@ static char xslmsg[] =
|
|||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <script type=\"text/javascript\">\n"
|
" <script type=\"text/javascript\">\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title': \"Outgoing queries for view: <xsl:value-of select=\"@name\"/>\",\n"
|
" 'title': \"Outgoing Queries for view: <xsl:value-of select=\"@name\"/>\",\n"
|
||||||
" 'target': 'chart_outgoing_queries_view_<xsl:value-of select=\"@name\"/>',\n"
|
" 'target': 'chart_outgoing_queries_view_<xsl:value-of select=\"@name\"/>',\n"
|
||||||
|
" 'style': 'barchart',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="resqtype"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="resqtype"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
" \n"
|
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" <xsl:variable name=\"target\">\n"
|
" <xsl:variable name=\"target\">\n"
|
||||||
" <xsl:value-of select=\"@name\"/>\n"
|
" <xsl:value-of select=\"@name\"/>\n"
|
||||||
" </xsl:variable>\n"
|
" </xsl:variable>\n"
|
||||||
" <div class=\"pie\" id=\"chart_outgoing_queries_view_{$target}\"/>\n"
|
" <div class=\"pie\" id=\"chart_outgoing_queries_view_{$target}\">[no data to display]</div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="resqtype"]/counter\">\n"
|
" <xsl:for-each select=\"counters[@type="resqtype"]/counter\">\n"
|
||||||
@@ -311,6 +403,8 @@ static char xslmsg[] =
|
|||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"server/counters[@type="nsstat"]/counter[.>0]\">\n"
|
||||||
" <h2>Server Statistics</h2>\n"
|
" <h2>Server Statistics</h2>\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
@@ -318,11 +412,11 @@ static char xslmsg[] =
|
|||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title' : \"Server Counters\",\n"
|
" 'title' : \"Server Counters\",\n"
|
||||||
" 'target': 'chart_server_nsstat_restype',\n"
|
" 'target': 'chart_server_nsstat_restype',\n"
|
||||||
|
" 'style': 'barchart',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="nsstat"]/counter[.>0]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="nsstat"]/counter[.>0]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
" \n"
|
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" <div class=\"pie\" id=\"chart_server_nsstat_restype\"/>\n"
|
" <div class=\"pie\" id=\"chart_server_nsstat_restype\">[no data to display]</div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="nsstat"]/counter[.>0]\">\n"
|
" <xsl:for-each select=\"server/counters[@type="nsstat"]/counter[.>0]\">\n"
|
||||||
@@ -344,18 +438,20 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
" <h2>Zone Maintenance Statistics</h2>\n"
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"server/counters[@type="zonestat"]/counter[.>0]\">\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
|
" <h2>Zone Maintenance Statistics</h2>\n"
|
||||||
" <script type=\"text/javascript\">\n"
|
" <script type=\"text/javascript\">\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title' : \"Zone Maintenance Stats\",\n"
|
" 'title' : \"Zone Maintenance Stats\",\n"
|
||||||
" 'target': 'chart_server_zone_maint',\n"
|
" 'target': 'chart_server_zone_maint',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="zonestat"]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'style': 'barchart',\n"
|
||||||
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type="zonestat"]/counter[.>0]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
"\n"
|
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <div class=\"pie\" id=\"chart_server_zone_maint\"/>\n"
|
" <div class=\"pie\" id=\"chart_server_zone_maint\">[no data to display]</div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="zonestat"]/counter\">\n"
|
" <xsl:for-each select=\"server/counters[@type="zonestat"]/counter\">\n"
|
||||||
@@ -376,6 +472,8 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"server/counters[@type="resstat"]/counter[.>0]\">\n"
|
||||||
" <h2>Resolver Statistics (Common)</h2>\n"
|
" <h2>Resolver Statistics (Common)</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="resstat"]/counter\">\n"
|
" <xsl:for-each select=\"server/counters[@type="resstat"]/counter\">\n"
|
||||||
@@ -396,7 +494,9 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" <xsl:for-each select=\"views/view\">\n"
|
" <xsl:for-each select=\"views/view\">\n"
|
||||||
|
" <xsl:if test=\"counters[@type="resstats"]/counter[.>0]\">\n"
|
||||||
" <h3>Resolver Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>Resolver Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="resstats"]/counter[.>0]\">\n"
|
" <xsl:for-each select=\"counters[@type="resstats"]/counter[.>0]\">\n"
|
||||||
@@ -417,10 +517,10 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
"\n"
|
|
||||||
"\n"
|
|
||||||
" <xsl:for-each select=\"views/view\">\n"
|
" <xsl:for-each select=\"views/view\">\n"
|
||||||
|
" <xsl:if test=\"counters[@type="adbstat"]/counter[.>0]\">\n"
|
||||||
" <h3>ADB Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>ADB Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="adbstat"]/counter[.>0]\">\n"
|
" <xsl:for-each select=\"counters[@type="adbstat"]/counter[.>0]\">\n"
|
||||||
@@ -441,9 +541,11 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
"\n"
|
"\n"
|
||||||
" <xsl:for-each select=\"views/view\">\n"
|
" <xsl:for-each select=\"views/view\">\n"
|
||||||
|
" <xsl:if test=\"counters[@type="cachestats"]/counter[.>0]\">\n"
|
||||||
" <h3>Cache Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>Cache Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="cachestats"]/counter[.>0]\">\n"
|
" <xsl:for-each select=\"counters[@type="cachestats"]/counter[.>0]\">\n"
|
||||||
@@ -464,11 +566,12 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"\n"
|
|
||||||
" <h3>Cache DB RRsets for View <xsl:value-of select=\"@name\"/></h3>\n"
|
|
||||||
" <xsl:for-each select=\"views/view\">\n"
|
" <xsl:for-each select=\"views/view\">\n"
|
||||||
|
" <xsl:if test=\"cache/rrset\">\n"
|
||||||
|
" <h3>Cache DB RRsets for View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"cache/rrset\">\n"
|
" <xsl:for-each select=\"cache/rrset\">\n"
|
||||||
" <xsl:variable name=\"css-class6\">\n"
|
" <xsl:variable name=\"css-class6\">\n"
|
||||||
@@ -488,7 +591,10 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
|
"\n"
|
||||||
|
" <xsl:if test=\"server/counters[@type="sockstat"]/counter[.>0]\">\n"
|
||||||
" <h2>Socket I/O Statistics</h2>\n"
|
" <h2>Socket I/O Statistics</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"server/counters[@type="sockstat"]/counter[.>0]\">\n"
|
" <xsl:for-each select=\"server/counters[@type="sockstat"]/counter[.>0]\">\n"
|
||||||
@@ -509,33 +615,35 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
" <br/>\n"
|
" </xsl:if>\n"
|
||||||
" <h2>Response Codes per view/zone</h2>\n"
|
" <xsl:if test=\"views/view[zones/zone/counters[@type="qtype"]/counter >0]\">\n"
|
||||||
" <xsl:for-each select=\"views/view[zones/zone/counters[@type="rcode"]/counter >0]\">\n"
|
" <h2>Received QTYPES per view/zone</h2>\n"
|
||||||
|
" <xsl:for-each select=\"views/view[zones/zone/counters[@type="qtype"]/counter >0]\">\n"
|
||||||
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <xsl:variable name=\"thisview\">\n"
|
" <xsl:variable name=\"thisview\">\n"
|
||||||
" <xsl:value-of select=\"@name\"/>\n"
|
" <xsl:value-of select=\"@name\"/>\n"
|
||||||
" </xsl:variable>\n"
|
" </xsl:variable>\n"
|
||||||
" <xsl:for-each select=\"zones/zone\">\n"
|
" <xsl:for-each select=\"zones/zone\">\n"
|
||||||
" <xsl:if test=\"counters[@type="rcode"]/counter[. > 0]\">\n"
|
" <xsl:if test=\"counters[@type="qtype"]/counter[count(.) > 0]\">\n"
|
||||||
" <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
|
" <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <script type=\"text/javascript\">\n"
|
" <script type=\"text/javascript\">\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title': \"Response Codes for zone <xsl:value-of select=\"@name\"/>\",\n"
|
" 'title': \"Query types for zone <xsl:value-of select=\"@name\"/>\",\n"
|
||||||
" 'target': 'chart_rescode_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
|
" 'target': 'chart_qtype_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'style': 'barchart',\n"
|
||||||
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="qtype"]/counter[.>0 and @name != "QryAuthAns"]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
"\n"
|
"\n"
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" <xsl:variable name=\"target\">\n"
|
" <xsl:variable name=\"target\">\n"
|
||||||
" <xsl:value-of select=\"@name\"/>\n"
|
" <xsl:value-of select=\"@name\"/>\n"
|
||||||
" </xsl:variable>\n"
|
" </xsl:variable>\n"
|
||||||
" <div class=\"pie\" id=\"chart_rescode_{$thisview}_{$target}\"/>\n"
|
" <div class=\"pie\" id=\"chart_qtype_{$thisview}_{$target}\">[no data to display]</div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">\n"
|
" <xsl:for-each select=\"counters[@type="qtype"]/counter\">\n"
|
||||||
" <xsl:sort select=\".\"/>\n"
|
" <xsl:sort select=\".\"/>\n"
|
||||||
" <xsl:variable name=\"css-class10\">\n"
|
" <xsl:variable name=\"css-class10\">\n"
|
||||||
" <xsl:choose>\n"
|
" <xsl:choose>\n"
|
||||||
@@ -556,32 +664,35 @@ static char xslmsg[] =
|
|||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" <h2>Received QTYPES per view/zone</h2>\n"
|
" </xsl:if>\n"
|
||||||
" <xsl:for-each select=\"views/view[zones/zone/counters[@type="qtype"]/counter >0]\">\n"
|
" <xsl:if test=\"views/view[zones/zone/counters[@type="rcode"]/counter >0]\">\n"
|
||||||
|
" <h2>Response Codes per view/zone</h2>\n"
|
||||||
|
" <xsl:for-each select=\"views/view[zones/zone/counters[@type="rcode"]/counter >0]\">\n"
|
||||||
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
" <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
|
||||||
" <xsl:variable name=\"thisview2\">\n"
|
" <xsl:variable name=\"thisview2\">\n"
|
||||||
" <xsl:value-of select=\"@name\"/>\n"
|
" <xsl:value-of select=\"@name\"/>\n"
|
||||||
" </xsl:variable>\n"
|
" </xsl:variable>\n"
|
||||||
" <xsl:for-each select=\"zones/zone\">\n"
|
" <xsl:for-each select=\"zones/zone\">\n"
|
||||||
" <xsl:if test=\"counters[@type="qtype"]/counter[count(.) > 0]\">\n"
|
" <xsl:if test=\"counters[@type="rcode"]/counter[. > 0]\">\n"
|
||||||
" <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
|
" <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
|
||||||
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
" <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
|
||||||
" <!-- Non Mozilla specific markup -->\n"
|
" <!-- Non Mozilla specific markup -->\n"
|
||||||
" <script type=\"text/javascript\">\n"
|
" <script type=\"text/javascript\">\n"
|
||||||
" graphs.push({\n"
|
" graphs.push({\n"
|
||||||
" 'title': \"Query Types for zone <xsl:value-of select=\"@name\"/>\",\n"
|
" 'title': \"Response codes for zone <xsl:value-of select=\"@name\"/>\",\n"
|
||||||
" 'target': 'chart_qtype_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
|
" 'target': 'chart_rescode_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
|
||||||
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="qtype"]/counter[.>0 and @name != "QryAuthAns"]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
" 'style': 'barchart',\n"
|
||||||
|
" 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
"\n"
|
"\n"
|
||||||
" </script>\n"
|
" </script>\n"
|
||||||
" <xsl:variable name=\"target\">\n"
|
" <xsl:variable name=\"target\">\n"
|
||||||
" <xsl:value-of select=\"@name\"/>\n"
|
" <xsl:value-of select=\"@name\"/>\n"
|
||||||
" </xsl:variable>\n"
|
" </xsl:variable>\n"
|
||||||
" <div class=\"pie\" id=\"chart_qtype_{$thisview2}_{$target}\"/>\n"
|
" <div class=\"pie\" id=\"chart_rescode_{$thisview2}_{$target}\">[no data to display]</div>\n"
|
||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"counters[@type="qtype"]/counter\">\n"
|
" <xsl:for-each select=\"counters[@type="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">\n"
|
||||||
" <xsl:sort select=\".\"/>\n"
|
" <xsl:sort select=\".\"/>\n"
|
||||||
" <xsl:variable name=\"css-class11\">\n"
|
" <xsl:variable name=\"css-class11\">\n"
|
||||||
" <xsl:choose>\n"
|
" <xsl:choose>\n"
|
||||||
@@ -602,8 +713,10 @@ static char xslmsg[] =
|
|||||||
" </xsl:if>\n"
|
" </xsl:if>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"socketmgr/sockets/socket\">\n"
|
||||||
" <h2>Network Status</h2>\n"
|
" <h2>Network Status</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"netstat\">\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
" <th>ID</th>\n"
|
" <th>ID</th>\n"
|
||||||
" <th>Name</th>\n"
|
" <th>Name</th>\n"
|
||||||
@@ -649,6 +762,8 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"taskmgr/thread-model/type\">\n"
|
||||||
" <h2>Task Manager Configuration</h2>\n"
|
" <h2>Task Manager Configuration</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
@@ -675,7 +790,7 @@ static char xslmsg[] =
|
|||||||
" <xsl:value-of select=\"taskmgr/thread-model/tasks-running\"/>\n"
|
" <xsl:value-of select=\"taskmgr/thread-model/tasks-running\"/>\n"
|
||||||
" </td>\n"
|
" </td>\n"
|
||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" <tr class=\"odd\">\n"
|
" <tr class=\"even\">\n"
|
||||||
" <th>Tasks Ready</th>\n"
|
" <th>Tasks Ready</th>\n"
|
||||||
" <td>\n"
|
" <td>\n"
|
||||||
" <xsl:value-of select=\"taskmgr/thread-model/tasks-ready\"/>\n"
|
" <xsl:value-of select=\"taskmgr/thread-model/tasks-ready\"/>\n"
|
||||||
@@ -683,8 +798,10 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"taskmgr/tasks/task\">\n"
|
||||||
" <h2>Tasks</h2>\n"
|
" <h2>Tasks</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"tasks\">\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
" <th>ID</th>\n"
|
" <th>ID</th>\n"
|
||||||
" <th>Name</th>\n"
|
" <th>Name</th>\n"
|
||||||
@@ -724,6 +841,8 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"memory/summary\">\n"
|
||||||
" <h2>Memory Usage Summary</h2>\n"
|
" <h2>Memory Usage Summary</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"counters\">\n"
|
||||||
" <xsl:for-each select=\"memory/summary/*\">\n"
|
" <xsl:for-each select=\"memory/summary/*\">\n"
|
||||||
@@ -744,8 +863,10 @@ static char xslmsg[] =
|
|||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
" <br/>\n"
|
" <br/>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
|
" <xsl:if test=\"memory/contexts/context\">\n"
|
||||||
" <h2>Memory Contexts</h2>\n"
|
" <h2>Memory Contexts</h2>\n"
|
||||||
" <table class=\"counters\">\n"
|
" <table class=\"mctx\">\n"
|
||||||
" <tr>\n"
|
" <tr>\n"
|
||||||
" <th>ID</th>\n"
|
" <th>ID</th>\n"
|
||||||
" <th>Name</th>\n"
|
" <th>Name</th>\n"
|
||||||
@@ -800,6 +921,7 @@ static char xslmsg[] =
|
|||||||
" </tr>\n"
|
" </tr>\n"
|
||||||
" </xsl:for-each>\n"
|
" </xsl:for-each>\n"
|
||||||
" </table>\n"
|
" </table>\n"
|
||||||
|
" </xsl:if>\n"
|
||||||
" <hr/>\n"
|
" <hr/>\n"
|
||||||
" <p class=\"footer\">Internet Systems Consortium Inc.<br/><a href=\"http://www.isc.org\">http://www.isc.org</a></p>\n"
|
" <p class=\"footer\">Internet Systems Consortium Inc.<br/><a href=\"http://www.isc.org\">http://www.isc.org</a></p>\n"
|
||||||
" </body>\n"
|
" </body>\n"
|
||||||
|
@@ -37,6 +37,7 @@ while (<>) {
|
|||||||
s/\>\ \</\>\</g;
|
s/\>\ \</\>\</g;
|
||||||
s/\"/\\\"/g;
|
s/\"/\\\"/g;
|
||||||
s/^/\t\"/;
|
s/^/\t\"/;
|
||||||
|
s/[\ \t]+$//g;
|
||||||
s/$/\\n\"/;
|
s/$/\\n\"/;
|
||||||
if ($lines eq "") {
|
if ($lines eq "") {
|
||||||
$lines .= $_;
|
$lines .= $_;
|
||||||
|
@@ -8779,6 +8779,9 @@ ns_server_add_zone(ns_server_t *server, char *args) {
|
|||||||
"zone %s added to view %s via addzone",
|
"zone %s added to view %s via addzone",
|
||||||
zonename, viewname);
|
zonename, viewname);
|
||||||
|
|
||||||
|
/* Adding a zone counts as reconfiguration */
|
||||||
|
CHECK(isc_time_now(&ns_g_configtime));
|
||||||
|
|
||||||
result = ISC_R_SUCCESS;
|
result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
@@ -9038,6 +9041,9 @@ ns_server_del_zone(ns_server_t *server, char *args, isc_buffer_t *text) {
|
|||||||
NS_LOGMODULE_SERVER, ISC_LOG_INFO,
|
NS_LOGMODULE_SERVER, ISC_LOG_INFO,
|
||||||
"zone %s removed via delzone", zonename);
|
"zone %s removed via delzone", zonename);
|
||||||
|
|
||||||
|
/* Removing a zone counts as reconfiguration */
|
||||||
|
CHECK(isc_time_now(&ns_g_configtime));
|
||||||
|
|
||||||
result = ISC_R_SUCCESS;
|
result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@@ -856,8 +856,16 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBXML2
|
#ifdef HAVE_LIBXML2
|
||||||
|
/*
|
||||||
/* XXXMLG below here sucks. (not so much) */
|
* Which statistics to include when rendering to XML
|
||||||
|
*/
|
||||||
|
#define STATS_XML_STATUS 0x00 /* display only common statistics */
|
||||||
|
#define STATS_XML_SERVER 0x01
|
||||||
|
#define STATS_XML_ZONES 0x02
|
||||||
|
#define STATS_XML_TASKS 0x04
|
||||||
|
#define STATS_XML_NET 0x08
|
||||||
|
#define STATS_XML_MEM 0x10
|
||||||
|
#define STATS_XML_ALL 0xff
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
zone_xmlrender(dns_zone_t *zone, void *arg) {
|
zone_xmlrender(dns_zone_t *zone, void *arg) {
|
||||||
@@ -943,7 +951,9 @@ zone_xmlrender(dns_zone_t *zone, void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
|
generatexml(ns_server_t *server, isc_uint32_t flags,
|
||||||
|
int *buflen, xmlChar **buf)
|
||||||
|
{
|
||||||
char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
||||||
char configtime[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
char configtime[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
||||||
char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"];
|
||||||
@@ -974,29 +984,139 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
|
|||||||
ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\""));
|
ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\""));
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "statistics"));
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "statistics"));
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version",
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version",
|
||||||
ISC_XMLCHAR "3.1"));
|
ISC_XMLCHAR "3.4"));
|
||||||
|
|
||||||
/* Set common fields for statistics dump */
|
/* Set common fields for statistics dump */
|
||||||
dumparg.type = isc_statsformat_xml;
|
dumparg.type = isc_statsformat_xml;
|
||||||
dumparg.arg = writer;
|
dumparg.arg = writer;
|
||||||
|
|
||||||
|
/* Render server information */
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server"));
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"));
|
||||||
|
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime));
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* boot-time */
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "config-time"));
|
||||||
|
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR configtime));
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* config-time */
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"));
|
||||||
|
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr));
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* current-time */
|
||||||
|
|
||||||
|
if ((flags & STATS_XML_SERVER) != 0) {
|
||||||
|
dumparg.result = ISC_R_SUCCESS;
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "opcode"));
|
||||||
|
|
||||||
|
dns_opcodestats_dump(server->opcodestats, opcodestat_dump,
|
||||||
|
&dumparg, ISC_STATSDUMP_VERBOSE);
|
||||||
|
if (dumparg.result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterEndElement(writer));
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "qtype"));
|
||||||
|
|
||||||
|
dumparg.result = ISC_R_SUCCESS;
|
||||||
|
dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump,
|
||||||
|
&dumparg, 0);
|
||||||
|
if (dumparg.result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* counters */
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "nsstat"));
|
||||||
|
|
||||||
|
result = dump_counters(server->nsstats, isc_statsformat_xml,
|
||||||
|
writer, NULL, nsstats_xmldesc,
|
||||||
|
dns_nsstatscounter_max,
|
||||||
|
nsstats_index, nsstat_values,
|
||||||
|
ISC_STATSDUMP_VERBOSE);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /nsstat */
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "zonestat"));
|
||||||
|
|
||||||
|
result = dump_counters(server->zonestats, isc_statsformat_xml,
|
||||||
|
writer, NULL, zonestats_xmldesc,
|
||||||
|
dns_zonestatscounter_max,
|
||||||
|
zonestats_index, zonestat_values,
|
||||||
|
ISC_STATSDUMP_VERBOSE);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /zonestat */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Most of the common resolver statistics entries are 0, so
|
||||||
|
* we don't use the verbose dump here.
|
||||||
|
*/
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "resstat"));
|
||||||
|
result = dump_counters(server->resolverstats,
|
||||||
|
isc_statsformat_xml, writer,
|
||||||
|
NULL, resstats_xmldesc,
|
||||||
|
dns_resstatscounter_max,
|
||||||
|
resstats_index, resstat_values, 0);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* resstat */
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flags & STATS_XML_NET) != 0) {
|
||||||
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
||||||
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
||||||
|
ISC_XMLCHAR "sockstat"));
|
||||||
|
|
||||||
|
result = dump_counters(server->sockstats, isc_statsformat_xml,
|
||||||
|
writer, NULL, sockstats_xmldesc,
|
||||||
|
isc_sockstatscounter_max,
|
||||||
|
sockstats_index, sockstat_values,
|
||||||
|
ISC_STATSDUMP_VERBOSE);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /sockstat */
|
||||||
|
}
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /server */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start by rendering the views we know of here. For each view we
|
* Render views. For each view we know of, call its
|
||||||
* know of, call its rendering function.
|
* rendering function.
|
||||||
*/
|
*/
|
||||||
view = ISC_LIST_HEAD(server->viewlist);
|
view = ISC_LIST_HEAD(server->viewlist);
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views"));
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views"));
|
||||||
while (view != NULL) {
|
while (view != NULL &&
|
||||||
|
((flags & (STATS_XML_SERVER | STATS_XML_ZONES)) != 0))
|
||||||
|
{
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"));
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"));
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
|
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
|
||||||
ISC_XMLCHAR view->name));
|
ISC_XMLCHAR view->name));
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"));
|
if ((flags & STATS_XML_ZONES) != 0) {
|
||||||
result = dns_zt_apply(view->zonetable, ISC_TRUE, zone_xmlrender,
|
TRY0(xmlTextWriterStartElement(writer,
|
||||||
writer);
|
ISC_XMLCHAR "zones"));
|
||||||
if (result != ISC_R_SUCCESS)
|
result = dns_zt_apply(view->zonetable, ISC_TRUE,
|
||||||
goto error;
|
zone_xmlrender, writer);
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* zones */
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto error;
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /zones */
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flags & STATS_XML_SERVER) == 0) {
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /view */
|
||||||
|
view = ISC_LIST_NEXT(view, link);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer,
|
TRY0(xmlTextWriterStartElement(writer,
|
||||||
ISC_XMLCHAR "counters"));
|
ISC_XMLCHAR "counters"));
|
||||||
@@ -1071,115 +1191,28 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
|
|||||||
|
|
||||||
view = ISC_LIST_NEXT(view, link);
|
view = ISC_LIST_NEXT(view, link);
|
||||||
}
|
}
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* views */
|
TRY0(xmlTextWriterEndElement(writer)); /* /views */
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "socketmgr"));
|
if ((flags & STATS_XML_NET) != 0) {
|
||||||
TRY0(isc_socketmgr_renderxml(ns_g_socketmgr, writer));
|
TRY0(xmlTextWriterStartElement(writer,
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* socketmgr */
|
ISC_XMLCHAR "socketmgr"));
|
||||||
|
TRY0(isc_socketmgr_renderxml(ns_g_socketmgr, writer));
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /socketmgr */
|
||||||
|
}
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "taskmgr"));
|
if ((flags & STATS_XML_TASKS) != 0) {
|
||||||
TRY0(isc_taskmgr_renderxml(ns_g_taskmgr, writer));
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "taskmgr"));
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* taskmgr */
|
TRY0(isc_taskmgr_renderxml(ns_g_taskmgr, writer));
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /taskmgr */
|
||||||
|
}
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server"));
|
if ((flags & STATS_XML_MEM) != 0) {
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"));
|
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory"));
|
||||||
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime));
|
TRY0(isc_mem_renderxml(writer));
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* boot-time */
|
TRY0(xmlTextWriterEndElement(writer)); /* /memory */
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "config-time"));
|
}
|
||||||
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR configtime));
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* config-time */
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"));
|
|
||||||
TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr));
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* current-time */
|
|
||||||
|
|
||||||
dumparg.result = ISC_R_SUCCESS;
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "opcode"));
|
|
||||||
|
|
||||||
dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg,
|
|
||||||
0);
|
|
||||||
if (dumparg.result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters type=opcode */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "qtype"));
|
|
||||||
|
|
||||||
dumparg.result = ISC_R_SUCCESS;
|
|
||||||
dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump,
|
|
||||||
&dumparg, 0);
|
|
||||||
if (dumparg.result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "nsstat"));
|
|
||||||
|
|
||||||
result = dump_counters(server->nsstats, isc_statsformat_xml,
|
|
||||||
writer, NULL, nsstats_xmldesc,
|
|
||||||
dns_nsstatscounter_max,
|
|
||||||
nsstats_index, nsstat_values,
|
|
||||||
ISC_STATSDUMP_VERBOSE);
|
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters type=nsstat */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "zonestat"));
|
|
||||||
|
|
||||||
result = dump_counters(server->zonestats, isc_statsformat_xml, writer,
|
|
||||||
NULL, zonestats_xmldesc,
|
|
||||||
dns_zonestatscounter_max, zonestats_index,
|
|
||||||
zonestat_values, ISC_STATSDUMP_VERBOSE);
|
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters type=zonestat */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Most of the common resolver statistics entries are 0, so we don't
|
|
||||||
* use the verbose dump here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "resstat"));
|
|
||||||
result = dump_counters(server->resolverstats, isc_statsformat_xml,
|
|
||||||
writer, NULL, resstats_xmldesc,
|
|
||||||
dns_resstatscounter_max, resstats_index,
|
|
||||||
resstat_values, 0);
|
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters type=resstat */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
|
|
||||||
TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
|
|
||||||
ISC_XMLCHAR "sockstat"));
|
|
||||||
|
|
||||||
result = dump_counters(server->sockstats, isc_statsformat_xml,
|
|
||||||
writer, NULL, sockstats_xmldesc,
|
|
||||||
isc_sockstatscounter_max, sockstats_index,
|
|
||||||
sockstat_values, ISC_STATSDUMP_VERBOSE);
|
|
||||||
if (result != ISC_R_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* counters type=sockstat */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* server */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory"));
|
|
||||||
TRY0(isc_mem_renderxml(writer));
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* memory */
|
|
||||||
|
|
||||||
TRY0(xmlTextWriterEndElement(writer)); /* statistics */
|
|
||||||
|
|
||||||
|
TRY0(xmlTextWriterEndElement(writer)); /* /statistics */
|
||||||
TRY0(xmlTextWriterEndDocument(writer));
|
TRY0(xmlTextWriterEndDocument(writer));
|
||||||
|
|
||||||
xmlFreeTextWriter(writer);
|
xmlFreeTextWriter(writer);
|
||||||
@@ -1208,10 +1241,11 @@ wrap_xmlfree(isc_buffer_t *buffer, void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_index(const char *url, const char *querystring, void *arg,
|
render_xml(isc_uint32_t flags, const char *url, isc_httpdurl_t *urlinfo,
|
||||||
unsigned int *retcode, const char **retmsg, const char **mimetype,
|
const char *querystring, const char *headers, void *arg,
|
||||||
isc_buffer_t *b, isc_httpdfree_t **freecb,
|
unsigned int *retcode, const char **retmsg,
|
||||||
void **freecb_args)
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
unsigned char *msg = NULL;
|
unsigned char *msg = NULL;
|
||||||
int msglen;
|
int msglen;
|
||||||
@@ -1219,9 +1253,11 @@ render_index(const char *url, const char *querystring, void *arg,
|
|||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
|
||||||
UNUSED(url);
|
UNUSED(url);
|
||||||
|
UNUSED(urlinfo);
|
||||||
|
UNUSED(headers);
|
||||||
UNUSED(querystring);
|
UNUSED(querystring);
|
||||||
|
|
||||||
result = generatexml(server, &msglen, &msg);
|
result = generatexml(server, flags, &msglen, &msg);
|
||||||
|
|
||||||
if (result == ISC_R_SUCCESS) {
|
if (result == ISC_R_SUCCESS) {
|
||||||
*retcode = 200;
|
*retcode = 200;
|
||||||
@@ -1239,12 +1275,104 @@ render_index(const char *url, const char *querystring, void *arg,
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_all(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_ALL, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_status(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_STATUS, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_server(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_SERVER, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_zones(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_ZONES, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_net(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_NET, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_tasks(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_TASKS, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_xml_mem(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_xml(STATS_XML_MEM, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HAVE_LIBXML2 */
|
#endif /* HAVE_LIBXML2 */
|
||||||
|
|
||||||
#ifdef HAVE_JSON
|
#ifdef HAVE_JSON
|
||||||
/*
|
/*
|
||||||
* Which statistics to include when rendering to JSON
|
* Which statistics to include when rendering to JSON
|
||||||
*/
|
*/
|
||||||
|
#define STATS_JSON_STATUS 0x00 /* display only common statistics */
|
||||||
#define STATS_JSON_SERVER 0x01
|
#define STATS_JSON_SERVER 0x01
|
||||||
#define STATS_JSON_ZONES 0x02
|
#define STATS_JSON_ZONES 0x02
|
||||||
#define STATS_JSON_TASKS 0x04
|
#define STATS_JSON_TASKS 0x04
|
||||||
@@ -1372,7 +1500,7 @@ zone_jsonrender(dns_zone_t *zone, void *arg) {
|
|||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
generatejson(ns_server_t *server, size_t *msglen,
|
generatejson(ns_server_t *server, size_t *msglen,
|
||||||
const char **msg, json_object **rootp, isc_uint8_t flags)
|
const char **msg, json_object **rootp, isc_uint32_t flags)
|
||||||
{
|
{
|
||||||
dns_view_t *view;
|
dns_view_t *view;
|
||||||
isc_result_t result = ISC_R_SUCCESS;
|
isc_result_t result = ISC_R_SUCCESS;
|
||||||
@@ -1431,7 +1559,8 @@ generatejson(ns_server_t *server, size_t *msglen,
|
|||||||
dumparg.arg = counters;
|
dumparg.arg = counters;
|
||||||
|
|
||||||
dns_opcodestats_dump(server->opcodestats,
|
dns_opcodestats_dump(server->opcodestats,
|
||||||
opcodestat_dump, &dumparg, 0);
|
opcodestat_dump, &dumparg,
|
||||||
|
ISC_STATSDUMP_VERBOSE);
|
||||||
if (dumparg.result != ISC_R_SUCCESS) {
|
if (dumparg.result != ISC_R_SUCCESS) {
|
||||||
json_object_put(counters);
|
json_object_put(counters);
|
||||||
goto error;
|
goto error;
|
||||||
@@ -1745,7 +1874,9 @@ generatejson(ns_server_t *server, size_t *msglen,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json(isc_uint8_t flags, const char *url, const char *querystring,
|
render_json(isc_uint32_t flags,
|
||||||
|
const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers,
|
||||||
void *arg, unsigned int *retcode, const char **retmsg,
|
void *arg, unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
@@ -1758,6 +1889,8 @@ render_json(isc_uint8_t flags, const char *url, const char *querystring,
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
UNUSED(url);
|
UNUSED(url);
|
||||||
|
UNUSED(urlinfo);
|
||||||
|
UNUSED(headers);
|
||||||
UNUSED(querystring);
|
UNUSED(querystring);
|
||||||
|
|
||||||
result = generatejson(server, &msglen, &msg, &bindstats, flags);
|
result = generatejson(server, &msglen, &msg, &bindstats, flags);
|
||||||
@@ -1779,88 +1912,147 @@ render_json(isc_uint8_t flags, const char *url, const char *querystring,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_all(const char *url, const char *querystring, void *arg,
|
render_json_all(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_ALL, url, querystring, arg,
|
return (render_json(STATS_JSON_ALL, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_server(const char *url, const char *querystring, void *arg,
|
render_json_status(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_SERVER, url, querystring, arg,
|
return (render_json(STATS_JSON_STATUS, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_zones(const char *url, const char *querystring, void *arg,
|
render_json_server(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
|
unsigned int *retcode, const char **retmsg,
|
||||||
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
|
{
|
||||||
|
return (render_json(STATS_JSON_SERVER, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
|
retcode, retmsg, mimetype, b,
|
||||||
|
freecb, freecb_args));
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
render_json_zones(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_ZONES, url, querystring, arg,
|
return (render_json(STATS_JSON_ZONES, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_mem(const char *url, const char *querystring, void *arg,
|
render_json_mem(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_MEM, url, querystring, arg,
|
return (render_json(STATS_JSON_MEM, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_tasks(const char *url, const char *querystring, void *arg,
|
render_json_tasks(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_TASKS, url, querystring, arg,
|
return (render_json(STATS_JSON_TASKS, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_json_net(const char *url, const char *querystring, void *arg,
|
render_json_net(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
return (render_json(STATS_JSON_NET, url, querystring, arg,
|
return (render_json(STATS_JSON_NET, url, urlinfo,
|
||||||
|
querystring, headers, arg,
|
||||||
retcode, retmsg, mimetype, b,
|
retcode, retmsg, mimetype, b,
|
||||||
freecb, freecb_args));
|
freecb, freecb_args));
|
||||||
}
|
}
|
||||||
#endif /* HAVE_JSON */
|
#endif /* HAVE_JSON */
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_xsl(const char *url, const char *querystring, void *args,
|
render_xsl(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
unsigned int *retcode, const char **retmsg, const char **mimetype,
|
const char *querystring, const char *headers,
|
||||||
isc_buffer_t *b, isc_httpdfree_t **freecb,
|
void *args, unsigned int *retcode, const char **retmsg,
|
||||||
void **freecb_args)
|
const char **mimetype, isc_buffer_t *b,
|
||||||
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
{
|
{
|
||||||
|
isc_result_t result;
|
||||||
|
|
||||||
UNUSED(url);
|
UNUSED(url);
|
||||||
UNUSED(querystring);
|
UNUSED(querystring);
|
||||||
UNUSED(args);
|
UNUSED(args);
|
||||||
|
|
||||||
*retcode = 200;
|
|
||||||
*retmsg = "OK";
|
|
||||||
*mimetype = "text/xslt+xml";
|
|
||||||
isc_buffer_reinit(b, xslmsg, strlen(xslmsg));
|
|
||||||
isc_buffer_add(b, strlen(xslmsg));
|
|
||||||
*freecb = NULL;
|
*freecb = NULL;
|
||||||
*freecb_args = NULL;
|
*freecb_args = NULL;
|
||||||
|
*mimetype = "text/xslt+xml";
|
||||||
|
|
||||||
|
if (urlinfo->isstatic) {
|
||||||
|
isc_time_t when;
|
||||||
|
char *p = strcasestr(headers, "If-Modified-Since: ");
|
||||||
|
|
||||||
|
if (p != NULL) {
|
||||||
|
time_t t1, t2;
|
||||||
|
p += strlen("If-Modified-Since: ");
|
||||||
|
result = isc_time_parsehttptimestamp(p, &when);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto send;
|
||||||
|
|
||||||
|
result = isc_time_secondsastimet(&when, &t1);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto send;
|
||||||
|
|
||||||
|
result = isc_time_secondsastimet(&urlinfo->loadtime,
|
||||||
|
&t2);
|
||||||
|
if (result != ISC_R_SUCCESS)
|
||||||
|
goto send;
|
||||||
|
|
||||||
|
if (t1 < t2)
|
||||||
|
goto send;
|
||||||
|
|
||||||
|
*retcode = 304;
|
||||||
|
*retmsg = "Not modified";
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
send:
|
||||||
|
*retcode = 200;
|
||||||
|
*retmsg = "OK";
|
||||||
|
isc_buffer_reinit(b, xslmsg, strlen(xslmsg));
|
||||||
|
isc_buffer_add(b, strlen(xslmsg));
|
||||||
|
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
@@ -1986,27 +2178,45 @@ add_listener(ns_server_t *server, ns_statschannel_t **listenerp,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
#ifdef HAVE_LIBXML2
|
#ifdef HAVE_LIBXML2
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/", render_index, server);
|
isc_httpdmgr_addurl(listener->httpdmgr, "/",
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/xml", render_index, server);
|
render_xml_all, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3", render_index,
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml",
|
||||||
server);
|
render_xml_all, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3",
|
||||||
|
render_xml_all, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/status",
|
||||||
|
render_xml_status, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/server",
|
||||||
|
render_xml_server, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/zones",
|
||||||
|
render_xml_zones, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/net",
|
||||||
|
render_xml_net, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/tasks",
|
||||||
|
render_xml_tasks, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/xml/v3/mem",
|
||||||
|
render_xml_mem, server);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_JSON
|
#ifdef HAVE_JSON
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json",
|
||||||
render_json_all, server);
|
render_json_all, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json/server",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1",
|
||||||
|
render_json_all, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/status",
|
||||||
|
render_json_status, server);
|
||||||
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/server",
|
||||||
render_json_server, server);
|
render_json_server, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json/zones",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/zones",
|
||||||
render_json_zones, server);
|
render_json_zones, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json/tasks",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/tasks",
|
||||||
render_json_tasks, server);
|
render_json_tasks, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json/net",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/net",
|
||||||
render_json_net, server);
|
render_json_net, server);
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/json/mem",
|
isc_httpdmgr_addurl(listener->httpdmgr, "/json/v1/mem",
|
||||||
render_json_mem, server);
|
render_json_mem, server);
|
||||||
#endif
|
#endif
|
||||||
isc_httpdmgr_addurl(listener->httpdmgr, "/bind9.xsl", render_xsl,
|
isc_httpdmgr_addurl2(listener->httpdmgr, "/bind9.xsl", ISC_TRUE,
|
||||||
server);
|
render_xsl, server);
|
||||||
|
|
||||||
*listenerp = listener;
|
*listenerp = listener;
|
||||||
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
||||||
|
@@ -10256,25 +10256,50 @@ example.com CNAME rpz-tcp-only.
|
|||||||
error.
|
error.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Broken-out subsets of the statistics can be viewed at
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/status"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/status</ulink>
|
||||||
|
(server uptime and last reconfiguration time),
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/server"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/server</ulink>
|
||||||
|
(server and resolver statistics),
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/zones"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/zones</ulink>
|
||||||
|
(zone statistics),
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/net"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/net</ulink>
|
||||||
|
(network status and socket statistics),
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/mem"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/mem</ulink>
|
||||||
|
(memory manager statistics),
|
||||||
|
<ulink url="http://127.0.0.1:8888/xml/v3/tasks"
|
||||||
|
>http://127.0.0.1:8888/xml/v3/tasks</ulink>
|
||||||
|
(task manager statistics).
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
The full set of statistics can also be read in JSON format at
|
The full set of statistics can also be read in JSON format at
|
||||||
<ulink url="http://127.0.0.1:8888/json"
|
<ulink url="http://127.0.0.1:8888/json"
|
||||||
>http://127.0.0.1:8888/json</ulink>.
|
>http://127.0.0.1:8888/json</ulink>,
|
||||||
Broken-out subsets of the statistics can be viewed at
|
with the broken-out subsets at
|
||||||
<ulink url="http://127.0.0.1:8888/json/server"
|
<ulink url="http://127.0.0.1:8888/json/v1/status"
|
||||||
>http://127.0.0.1:8888/json/server</ulink>
|
>http://127.0.0.1:8888/json/v1/status</ulink>
|
||||||
|
(server uptime and last reconfiguration time),
|
||||||
|
<ulink url="http://127.0.0.1:8888/json/v1/server"
|
||||||
|
>http://127.0.0.1:8888/json/v1/server</ulink>
|
||||||
(server and resolver statistics),
|
(server and resolver statistics),
|
||||||
<ulink url="http://127.0.0.1:8888/json/zones"
|
<ulink url="http://127.0.0.1:8888/json/v1/zones"
|
||||||
>http://127.0.0.1:8888/json/zones</ulink>
|
>http://127.0.0.1:8888/json/v1/zones</ulink>
|
||||||
(zone statistics),
|
(zone statistics),
|
||||||
<ulink url="http://127.0.0.1:8888/json/net"
|
<ulink url="http://127.0.0.1:8888/json/v1/net"
|
||||||
>http://127.0.0.1:8888/json/net</ulink>
|
>http://127.0.0.1:8888/json/v1/net</ulink>
|
||||||
(network status and socket statistics),
|
(network status and socket statistics),
|
||||||
<ulink url="http://127.0.0.1:8888/json/mem"
|
<ulink url="http://127.0.0.1:8888/json/v1/mem"
|
||||||
>http://127.0.0.1:8888/json/mem</ulink>
|
>http://127.0.0.1:8888/json/v1/mem</ulink>
|
||||||
(memory manager statistics),
|
(memory manager statistics),
|
||||||
<ulink url="http://127.0.0.1:8888/json/tasks"
|
<ulink url="http://127.0.0.1:8888/json/v1/tasks"
|
||||||
>http://127.0.0.1:8888/json/tasks</ulink>
|
>http://127.0.0.1:8888/json/v1/tasks</ulink>
|
||||||
(task manager statistics).
|
(task manager statistics).
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
|
120
lib/isc/httpd.c
120
lib/isc/httpd.c
@@ -26,6 +26,7 @@
|
|||||||
#include <isc/socket.h>
|
#include <isc/socket.h>
|
||||||
#include <isc/string.h>
|
#include <isc/string.h>
|
||||||
#include <isc/task.h>
|
#include <isc/task.h>
|
||||||
|
#include <isc/time.h>
|
||||||
#include <isc/util.h>
|
#include <isc/util.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -58,20 +59,6 @@
|
|||||||
#define HTTP_SENDGROW 1024
|
#define HTTP_SENDGROW 1024
|
||||||
#define HTTP_SEND_MAXLEN 10240
|
#define HTTP_SEND_MAXLEN 10240
|
||||||
|
|
||||||
/*%
|
|
||||||
* HTTP urls. These are the URLs we manage, and the function to call to
|
|
||||||
* provide the data for it. We pass in the base url (so the same function
|
|
||||||
* can handle multiple requests), and a structure to fill in to return a
|
|
||||||
* result to the client. We also pass in a pointer to be filled in for
|
|
||||||
* the data cleanup function.
|
|
||||||
*/
|
|
||||||
struct isc_httpdurl {
|
|
||||||
char *url;
|
|
||||||
isc_httpdaction_t *action;
|
|
||||||
void *action_arg;
|
|
||||||
ISC_LINK(isc_httpdurl_t) link;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define HTTPD_CLOSE 0x0001 /* Got a Connection: close header */
|
#define HTTPD_CLOSE 0x0001 /* Got a Connection: close header */
|
||||||
#define HTTPD_FOUNDHOST 0x0002 /* Got a Host: header */
|
#define HTTPD_FOUNDHOST 0x0002 /* Got a Host: header */
|
||||||
|
|
||||||
@@ -87,6 +74,7 @@ struct isc_httpd {
|
|||||||
*/
|
*/
|
||||||
char recvbuf[HTTP_RECVLEN]; /*%< receive buffer */
|
char recvbuf[HTTP_RECVLEN]; /*%< receive buffer */
|
||||||
isc_uint32_t recvlen; /*%< length recv'd */
|
isc_uint32_t recvlen; /*%< length recv'd */
|
||||||
|
char *headers; /*%< set in process_request() */
|
||||||
unsigned int method;
|
unsigned int method;
|
||||||
char *url;
|
char *url;
|
||||||
char *querystring;
|
char *querystring;
|
||||||
@@ -217,20 +205,12 @@ static isc_result_t process_request(isc_httpd_t *, int);
|
|||||||
static void httpdmgr_destroy(isc_httpdmgr_t *);
|
static void httpdmgr_destroy(isc_httpdmgr_t *);
|
||||||
static isc_result_t grow_headerspace(isc_httpd_t *);
|
static isc_result_t grow_headerspace(isc_httpd_t *);
|
||||||
static void reset_client(isc_httpd_t *httpd);
|
static void reset_client(isc_httpd_t *httpd);
|
||||||
static isc_result_t render_404(const char *, const char *,
|
|
||||||
void *,
|
static isc_httpdaction_t render_404;
|
||||||
unsigned int *, const char **,
|
static isc_httpdaction_t render_500;
|
||||||
const char **, isc_buffer_t *,
|
|
||||||
isc_httpdfree_t **, void **);
|
|
||||||
static isc_result_t render_500(const char *, const char *,
|
|
||||||
void *,
|
|
||||||
unsigned int *, const char **,
|
|
||||||
const char **, isc_buffer_t *,
|
|
||||||
isc_httpdfree_t **, void **);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
destroy_client(isc_httpd_t **httpdp)
|
destroy_client(isc_httpd_t **httpdp) {
|
||||||
{
|
|
||||||
isc_httpd_t *httpd = *httpdp;
|
isc_httpd_t *httpd = *httpdp;
|
||||||
isc_httpdmgr_t *httpdmgr = httpd->mgr;
|
isc_httpdmgr_t *httpdmgr = httpd->mgr;
|
||||||
|
|
||||||
@@ -321,8 +301,7 @@ isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
httpdmgr_destroy(isc_httpdmgr_t *httpdmgr)
|
httpdmgr_destroy(isc_httpdmgr_t *httpdmgr) {
|
||||||
{
|
|
||||||
isc_mem_t *mctx;
|
isc_mem_t *mctx;
|
||||||
isc_httpdurl_t *url;
|
isc_httpdurl_t *url;
|
||||||
|
|
||||||
@@ -379,8 +358,7 @@ httpdmgr_destroy(isc_httpdmgr_t *httpdmgr)
|
|||||||
#define BUFLENOK(s) (httpd->recvbuf - (s) < HTTP_RECVLEN)
|
#define BUFLENOK(s) (httpd->recvbuf - (s) < HTTP_RECVLEN)
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
process_request(isc_httpd_t *httpd, int length)
|
process_request(isc_httpd_t *httpd, int length) {
|
||||||
{
|
|
||||||
char *s;
|
char *s;
|
||||||
char *p;
|
char *p;
|
||||||
int delim;
|
int delim;
|
||||||
@@ -390,6 +368,7 @@ process_request(isc_httpd_t *httpd, int length)
|
|||||||
httpd->recvlen += length;
|
httpd->recvlen += length;
|
||||||
|
|
||||||
httpd->recvbuf[httpd->recvlen] = 0;
|
httpd->recvbuf[httpd->recvlen] = 0;
|
||||||
|
httpd->headers = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't find a blank line in our buffer, return that we need
|
* If we don't find a blank line in our buffer, return that we need
|
||||||
@@ -494,6 +473,8 @@ process_request(isc_httpd_t *httpd, int length)
|
|||||||
p = s + 1;
|
p = s + 1;
|
||||||
s = p;
|
s = p;
|
||||||
|
|
||||||
|
httpd->headers = s;
|
||||||
|
|
||||||
if (strstr(s, "Connection: close") != NULL)
|
if (strstr(s, "Connection: close") != NULL)
|
||||||
httpd->flags |= HTTPD_CLOSE;
|
httpd->flags |= HTTPD_CLOSE;
|
||||||
|
|
||||||
@@ -513,8 +494,7 @@ process_request(isc_httpd_t *httpd, int length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
isc_httpd_accept(isc_task_t *task, isc_event_t *ev)
|
isc_httpd_accept(isc_task_t *task, isc_event_t *ev) {
|
||||||
{
|
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
isc_httpdmgr_t *httpdmgr = ev->ev_arg;
|
isc_httpdmgr_t *httpdmgr = ev->ev_arg;
|
||||||
isc_httpd_t *httpd;
|
isc_httpd_t *httpd;
|
||||||
@@ -609,8 +589,8 @@ isc_httpd_accept(isc_task_t *task, isc_event_t *ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_404(const char *url, const char *querystring,
|
render_404(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
void *arg,
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
@@ -618,7 +598,9 @@ render_404(const char *url, const char *querystring,
|
|||||||
static char msg[] = "No such URL.";
|
static char msg[] = "No such URL.";
|
||||||
|
|
||||||
UNUSED(url);
|
UNUSED(url);
|
||||||
|
UNUSED(urlinfo);
|
||||||
UNUSED(querystring);
|
UNUSED(querystring);
|
||||||
|
UNUSED(headers);
|
||||||
UNUSED(arg);
|
UNUSED(arg);
|
||||||
|
|
||||||
*retcode = 404;
|
*retcode = 404;
|
||||||
@@ -633,8 +615,8 @@ render_404(const char *url, const char *querystring,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
render_500(const char *url, const char *querystring,
|
render_500(const char *url, isc_httpdurl_t *urlinfo,
|
||||||
void *arg,
|
const char *querystring, const char *headers, void *arg,
|
||||||
unsigned int *retcode, const char **retmsg,
|
unsigned int *retcode, const char **retmsg,
|
||||||
const char **mimetype, isc_buffer_t *b,
|
const char **mimetype, isc_buffer_t *b,
|
||||||
isc_httpdfree_t **freecb, void **freecb_args)
|
isc_httpdfree_t **freecb, void **freecb_args)
|
||||||
@@ -642,7 +624,9 @@ render_500(const char *url, const char *querystring,
|
|||||||
static char msg[] = "Internal server failure.";
|
static char msg[] = "Internal server failure.";
|
||||||
|
|
||||||
UNUSED(url);
|
UNUSED(url);
|
||||||
|
UNUSED(urlinfo);
|
||||||
UNUSED(querystring);
|
UNUSED(querystring);
|
||||||
|
UNUSED(headers);
|
||||||
UNUSED(arg);
|
UNUSED(arg);
|
||||||
|
|
||||||
*retcode = 500;
|
*retcode = 500;
|
||||||
@@ -657,8 +641,7 @@ render_500(const char *url, const char *querystring,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
|
isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) {
|
||||||
{
|
|
||||||
isc_region_t r;
|
isc_region_t r;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
isc_httpd_t *httpd = ev->ev_arg;
|
isc_httpd_t *httpd = ev->ev_arg;
|
||||||
@@ -710,8 +693,9 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
|
|||||||
url = ISC_LIST_NEXT(url, link);
|
url = ISC_LIST_NEXT(url, link);
|
||||||
}
|
}
|
||||||
if (url == NULL)
|
if (url == NULL)
|
||||||
result = httpd->mgr->render_404(httpd->url, httpd->querystring,
|
result = httpd->mgr->render_404(httpd->url, NULL,
|
||||||
NULL,
|
httpd->querystring,
|
||||||
|
NULL, NULL,
|
||||||
&httpd->retcode,
|
&httpd->retcode,
|
||||||
&httpd->retmsg,
|
&httpd->retmsg,
|
||||||
&httpd->mimetype,
|
&httpd->mimetype,
|
||||||
@@ -719,14 +703,18 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
|
|||||||
&httpd->freecb,
|
&httpd->freecb,
|
||||||
&httpd->freecb_arg);
|
&httpd->freecb_arg);
|
||||||
else
|
else
|
||||||
result = url->action(httpd->url, httpd->querystring,
|
result = url->action(httpd->url, url,
|
||||||
|
httpd->querystring,
|
||||||
|
httpd->headers,
|
||||||
url->action_arg,
|
url->action_arg,
|
||||||
&httpd->retcode, &httpd->retmsg,
|
&httpd->retcode, &httpd->retmsg,
|
||||||
&httpd->mimetype, &httpd->bodybuffer,
|
&httpd->mimetype, &httpd->bodybuffer,
|
||||||
&httpd->freecb, &httpd->freecb_arg);
|
&httpd->freecb, &httpd->freecb_arg);
|
||||||
if (result != ISC_R_SUCCESS) {
|
if (result != ISC_R_SUCCESS) {
|
||||||
result = httpd->mgr->render_500(httpd->url, httpd->querystring,
|
result = httpd->mgr->render_500(httpd->url, url,
|
||||||
NULL, &httpd->retcode,
|
httpd->querystring,
|
||||||
|
NULL, NULL,
|
||||||
|
&httpd->retcode,
|
||||||
&httpd->retmsg,
|
&httpd->retmsg,
|
||||||
&httpd->mimetype,
|
&httpd->mimetype,
|
||||||
&httpd->bodybuffer,
|
&httpd->bodybuffer,
|
||||||
@@ -739,9 +727,19 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
|
|||||||
isc_httpd_addheader(httpd, "Content-Type", httpd->mimetype);
|
isc_httpd_addheader(httpd, "Content-Type", httpd->mimetype);
|
||||||
isc_httpd_addheader(httpd, "Date", datebuf);
|
isc_httpd_addheader(httpd, "Date", datebuf);
|
||||||
isc_httpd_addheader(httpd, "Expires", datebuf);
|
isc_httpd_addheader(httpd, "Expires", datebuf);
|
||||||
isc_httpd_addheader(httpd, "Last-Modified", datebuf);
|
|
||||||
isc_httpd_addheader(httpd, "Pragma: no-cache", NULL);
|
if (url != NULL && url->isstatic) {
|
||||||
isc_httpd_addheader(httpd, "Cache-Control: no-cache", NULL);
|
char loadbuf[32];
|
||||||
|
isc_time_formathttptimestamp(&url->loadtime,
|
||||||
|
loadbuf, sizeof(loadbuf));
|
||||||
|
isc_httpd_addheader(httpd, "Last-Modified", loadbuf);
|
||||||
|
isc_httpd_addheader(httpd, "Cache-Control: public", NULL);
|
||||||
|
} else {
|
||||||
|
isc_httpd_addheader(httpd, "Last-Modified", datebuf);
|
||||||
|
isc_httpd_addheader(httpd, "Pragma: no-cache", NULL);
|
||||||
|
isc_httpd_addheader(httpd, "Cache-Control: no-cache", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
isc_httpd_addheader(httpd, "Server: libisc", NULL);
|
isc_httpd_addheader(httpd, "Server: libisc", NULL);
|
||||||
isc_httpd_addheaderuint(httpd, "Content-Length",
|
isc_httpd_addheaderuint(httpd, "Content-Length",
|
||||||
isc_buffer_usedlength(&httpd->bodybuffer));
|
isc_buffer_usedlength(&httpd->bodybuffer));
|
||||||
@@ -766,8 +764,7 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdmgrp)
|
isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdmgrp) {
|
||||||
{
|
|
||||||
isc_httpdmgr_t *httpdmgr;
|
isc_httpdmgr_t *httpdmgr;
|
||||||
isc_httpd_t *httpd;
|
isc_httpd_t *httpd;
|
||||||
httpdmgr = *httpdmgrp;
|
httpdmgr = *httpdmgrp;
|
||||||
@@ -794,8 +791,7 @@ isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdmgrp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
grow_headerspace(isc_httpd_t *httpd)
|
grow_headerspace(isc_httpd_t *httpd) {
|
||||||
{
|
|
||||||
char *newspace;
|
char *newspace;
|
||||||
unsigned int newlen;
|
unsigned int newlen;
|
||||||
isc_region_t r;
|
isc_region_t r;
|
||||||
@@ -816,8 +812,7 @@ grow_headerspace(isc_httpd_t *httpd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_httpd_response(isc_httpd_t *httpd)
|
isc_httpd_response(isc_httpd_t *httpd) {
|
||||||
{
|
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
unsigned int needlen;
|
unsigned int needlen;
|
||||||
|
|
||||||
@@ -869,8 +864,7 @@ isc_httpd_addheader(isc_httpd_t *httpd, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_httpd_endheaders(isc_httpd_t *httpd)
|
isc_httpd_endheaders(isc_httpd_t *httpd) {
|
||||||
{
|
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
|
||||||
while (isc_buffer_availablelength(&httpd->headerbuffer) < 2) {
|
while (isc_buffer_availablelength(&httpd->headerbuffer) < 2) {
|
||||||
@@ -912,8 +906,7 @@ isc_httpd_addheaderuint(isc_httpd_t *httpd, const char *name, int val) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
isc_httpd_senddone(isc_task_t *task, isc_event_t *ev)
|
isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) {
|
||||||
{
|
|
||||||
isc_httpd_t *httpd = ev->ev_arg;
|
isc_httpd_t *httpd = ev->ev_arg;
|
||||||
isc_region_t r;
|
isc_region_t r;
|
||||||
isc_socketevent_t *sev = (isc_socketevent_t *)ev;
|
isc_socketevent_t *sev = (isc_socketevent_t *)ev;
|
||||||
@@ -977,8 +970,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reset_client(isc_httpd_t *httpd)
|
reset_client(isc_httpd_t *httpd) {
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* Catch errors here. We MUST be in RECV mode, and we MUST NOT have
|
* Catch errors here. We MUST be in RECV mode, and we MUST NOT have
|
||||||
* any outstanding buffers. If we have buffers, we have a leak.
|
* any outstanding buffers. If we have buffers, we have a leak.
|
||||||
@@ -989,6 +981,7 @@ reset_client(isc_httpd_t *httpd)
|
|||||||
|
|
||||||
httpd->recvbuf[0] = 0;
|
httpd->recvbuf[0] = 0;
|
||||||
httpd->recvlen = 0;
|
httpd->recvlen = 0;
|
||||||
|
httpd->headers = NULL;
|
||||||
httpd->method = ISC_HTTPD_METHODUNKNOWN;
|
httpd->method = ISC_HTTPD_METHODUNKNOWN;
|
||||||
httpd->url = NULL;
|
httpd->url = NULL;
|
||||||
httpd->querystring = NULL;
|
httpd->querystring = NULL;
|
||||||
@@ -1002,6 +995,14 @@ reset_client(isc_httpd_t *httpd)
|
|||||||
isc_result_t
|
isc_result_t
|
||||||
isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
|
isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
|
||||||
isc_httpdaction_t *func, void *arg)
|
isc_httpdaction_t *func, void *arg)
|
||||||
|
{
|
||||||
|
return (isc_httpdmgr_addurl2(httpdmgr, url, ISC_FALSE, func, arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_httpdmgr_addurl2(isc_httpdmgr_t *httpdmgr, const char *url,
|
||||||
|
isc_boolean_t isstatic,
|
||||||
|
isc_httpdaction_t *func, void *arg)
|
||||||
{
|
{
|
||||||
isc_httpdurl_t *item;
|
isc_httpdurl_t *item;
|
||||||
|
|
||||||
@@ -1022,6 +1023,9 @@ isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
|
|||||||
|
|
||||||
item->action = func;
|
item->action = func;
|
||||||
item->action_arg = arg;
|
item->action_arg = arg;
|
||||||
|
item->isstatic = isstatic;
|
||||||
|
isc_time_now(&item->loadtime);
|
||||||
|
|
||||||
ISC_LINK_INIT(item, link);
|
ISC_LINK_INIT(item, link);
|
||||||
ISC_LIST_APPEND(httpdmgr->urls, item, link);
|
ISC_LIST_APPEND(httpdmgr->urls, item, link);
|
||||||
|
|
||||||
|
@@ -26,6 +26,23 @@
|
|||||||
#include <isc/types.h>
|
#include <isc/types.h>
|
||||||
#include <isc/mutex.h>
|
#include <isc/mutex.h>
|
||||||
#include <isc/task.h>
|
#include <isc/task.h>
|
||||||
|
#include <isc/time.h>
|
||||||
|
|
||||||
|
/*%
|
||||||
|
* HTTP urls. These are the URLs we manage, and the function to call to
|
||||||
|
* provide the data for it. We pass in the base url (so the same function
|
||||||
|
* can handle multiple requests), and a structure to fill in to return a
|
||||||
|
* result to the client. We also pass in a pointer to be filled in for
|
||||||
|
* the data cleanup function.
|
||||||
|
*/
|
||||||
|
struct isc_httpdurl {
|
||||||
|
char *url;
|
||||||
|
isc_httpdaction_t *action;
|
||||||
|
void *action_arg;
|
||||||
|
isc_boolean_t isstatic;
|
||||||
|
isc_time_t loadtime;
|
||||||
|
ISC_LINK(isc_httpdurl_t) link;
|
||||||
|
};
|
||||||
|
|
||||||
#define HTTPD_EVENTCLASS ISC_EVENTCLASS(4300)
|
#define HTTPD_EVENTCLASS ISC_EVENTCLASS(4300)
|
||||||
#define HTTPD_SHUTDOWN (HTTPD_EVENTCLASS + 0x0001)
|
#define HTTPD_SHUTDOWN (HTTPD_EVENTCLASS + 0x0001)
|
||||||
@@ -49,6 +66,11 @@ isc_result_t
|
|||||||
isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
|
isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
|
||||||
isc_httpdaction_t *func, void *arg);
|
isc_httpdaction_t *func, void *arg);
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_httpdmgr_addurl2(isc_httpdmgr_t *httpdmgr, const char *url,
|
||||||
|
isc_boolean_t isstatic,
|
||||||
|
isc_httpdaction_t *func, void *arg);
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_httpd_response(isc_httpd_t *httpd);
|
isc_httpd_response(isc_httpd_t *httpd);
|
||||||
|
|
||||||
|
@@ -103,7 +103,9 @@ typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int);
|
|||||||
|
|
||||||
/* The following cannot be listed alphabetically due to forward reference */
|
/* The following cannot be listed alphabetically due to forward reference */
|
||||||
typedef isc_result_t (isc_httpdaction_t)(const char *url,
|
typedef isc_result_t (isc_httpdaction_t)(const char *url,
|
||||||
|
isc_httpdurl_t *urlinfo,
|
||||||
const char *querystring,
|
const char *querystring,
|
||||||
|
const char *headers,
|
||||||
void *arg,
|
void *arg,
|
||||||
unsigned int *retcode,
|
unsigned int *retcode,
|
||||||
const char **retmsg,
|
const char **retmsg,
|
||||||
|
@@ -315,6 +315,16 @@ isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len);
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_time_parsehttptimestamp(char *input, isc_time_t *t);
|
||||||
|
/*%<
|
||||||
|
* Parse the time in 'input' into the isc_time_t pointed to by 't',
|
||||||
|
* expecting a format like "Mon, 30 Aug 2000 04:06:47 GMT"
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
*\li 'buf' and 't' are not NULL.
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len);
|
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len);
|
||||||
/*%<
|
/*%<
|
||||||
|
@@ -407,6 +407,24 @@ isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
|
|||||||
INSIST(flen < len);
|
INSIST(flen < len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_result_t
|
||||||
|
isc_time_parsehttptimestamp(char *buf, isc_time_t *t) {
|
||||||
|
struct tm t_tm;
|
||||||
|
time_t when;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
REQUIRE(buf != NULL);
|
||||||
|
REQUIRE(t != NULL);
|
||||||
|
p = strptime(buf, "%a, %d %b %Y %H:%M:%S %Z", &t_tm);
|
||||||
|
if (p == NULL)
|
||||||
|
return (ISC_R_UNEXPECTED);
|
||||||
|
when = timegm(&t_tm);
|
||||||
|
if (when == -1)
|
||||||
|
return (ISC_R_UNEXPECTED);
|
||||||
|
isc_time_set(t, when, 0);
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
|
isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
|
||||||
time_t now;
|
time_t now;
|
||||||
|
Reference in New Issue
Block a user