@@ -95,30 +95,27 @@ void printtable(ostringstream &ret, const string &ringname, const string &title,
95
95
int entries=0 ;
96
96
vector<pair <string,unsigned int > >ring=S.getRing (ringname);
97
97
98
- for (vector<pair<string, unsigned int > >::const_iterator i=ring.begin (); i!=ring.end ();++i) {
98
+ for (vector<pair<string, unsigned int > >::const_iterator i=ring.begin (); i!=ring.end ();++i) {
99
99
tot+=i->second ;
100
100
entries++;
101
101
}
102
102
103
-
104
- ret<<" <table border=1><tr><td colspan=3 bgcolor=\" #0000ff\" >"
105
- " <a href=\" ?ring=" <<ringname<<" \" ><font color=\" #ffffff\" >Top-" <<limit<<" of " ;
106
- ret<<entries<<" : " <<title<<" </font></a></td>" <<endl;
107
-
108
- ret<<" <tr><td colspan=3><table bgcolor=\" #ff0000\" width=\" 100%\" ><tr><td align=left>"
109
- " <a href=\" ?resetring=" <<ringname<<" \" ><font color=\" #ffffff\" >Reset</font></a></td>" ;
110
- ret<<" <td align=right>Resize: " ;
111
-
103
+ ret<<" <div class=\" panel\" >" ;
104
+ ret<<" <span class=resetring><i></i><a href=\" ?resetring=" <<ringname<<" \" >Reset</a></span>" <<endl;
105
+ ret<<" <h2>" <<title<<" </h2>" <<endl;
106
+ ret<<" <div class=ringmeta>" ;
107
+ ret<<" <a class=topXofY href=\" ?ring=" <<ringname<<" \" >Showing: Top " <<limit<<" of " <<entries<<" </a>" <<endl;
108
+ ret<<" <span class=resizering>Resize: " ;
112
109
unsigned int sizes[]={10 ,100 ,500 ,1000 ,10000 ,500000 ,0 };
113
110
for (int i=0 ;sizes[i];++i) {
114
111
if (S.getRingSize (ringname)!=sizes[i])
115
112
ret<<" <a href=\" ?resizering=" <<ringname<<" &size=" <<sizes[i]<<" \" >" <<sizes[i]<<" </a> " ;
116
113
else
117
114
ret<<" (" <<sizes[i]<<" ) " ;
118
115
}
119
- ret<<" </td></table>" <<endl;
120
-
116
+ ret<<" </span></div>" ;
121
117
118
+ ret<<" <table class=\" data\" >" ;
122
119
int printed=0 ;
123
120
for (vector<pair<string,unsigned int > >::const_iterator i=ring.begin ();limit && i!=ring.end ();++i,--limit) {
124
121
ret<<" <tr><td>" <<i->first <<" </td><td>" <<i->second <<" </td><td align=right>" << StatWebServer::makePercentage (i->second *100.0 /tot)<<" </td>" <<endl;
@@ -129,20 +126,19 @@ void printtable(ostringstream &ret, const string &ringname, const string &title,
129
126
ret<<" <tr><td><b>Rest:</b></td><td><b>" <<tot-printed<<" </b></td><td align=right><b>" << StatWebServer::makePercentage ((tot-printed)*100.0 /tot)<<" </b></td>" <<endl;
130
127
131
128
ret<<" <tr><td><b>Total:</b></td><td><b>" <<tot<<" </b></td><td align=right><b>100%</b></td>" ;
132
- ret<<" </table><br >" <<endl;
129
+ ret<<" </table></div >" <<endl;
133
130
}
134
131
135
132
void StatWebServer::printvars (ostringstream &ret)
136
133
{
137
- ret<<" <table border=1><tr><td colspan=3 bgcolor=\" #0000ff\" ><font color=\" #ffffff\" >Variables</font></td>" <<endl;
138
-
134
+ ret<<" <div class=panel><h2>Variables</h2><table class=\" data\" >" <<endl;
139
135
140
136
vector<string>entries=S.getEntries ();
141
137
for (vector<string>::const_iterator i=entries.begin ();i!=entries.end ();++i) {
142
138
ret<<" <tr><td>" <<*i<<" </td><td>" <<S.read (*i)<<" </td><td>" <<S.getDescrip (*i)<<" </td>" <<endl;
143
139
}
144
140
145
- ret<<" </table>" <<endl;
141
+ ret<<" </table></div> " <<endl;
146
142
}
147
143
148
144
void StatWebServer::printargs (ostringstream &ret)
@@ -177,17 +173,21 @@ string StatWebServer::indexfunction(const string& method, const string& post, co
177
173
178
174
ostringstream ret;
179
175
180
- ret<<" <!DOCTYPE HTML PUBLIC \" -//W3C//DTD HTML 4.01 Transitional//EN\" \" http://www.w3.org/TR/html4/loose.dtd\" >" <<endl;
181
- ret<<" <html><head><title>PowerDNS Operational Monitor</title></head><body bgcolor=\" #ffffff\" >" <<endl;
182
-
183
-
184
- ret<<" <h2>" ;
185
- if (!arg ()[" config-name" ].empty ())
186
- ret<<" [" <<arg ()[" config-name" ]<<" ]" ;
187
- if (rvarmap[" ring" ].empty ())
188
- ret<<" PDNS " VERSION" Main Page</h2>" <<endl;
189
- else
190
- ret<<" Details page</h2><a href=\" /\" >Back to main page</a>" <<endl;
176
+ ret<<" <!DOCTYPE html>" <<endl;
177
+ ret<<" <html><head>" <<endl;
178
+ ret<<" <title>PowerDNS Authoritative Server Monitor</title>" <<endl;
179
+ ret<<" <link rel=\" stylesheet\" href=\" style.css\" />" <<endl;
180
+ ret<<" </head><body>" <<endl;
181
+
182
+ ret<<" <div class=\" row\" >" <<endl;
183
+ ret<<" <div class=\" headl columns\" >" ;
184
+ ret<<" <a href=\" /\" id=\" appname\" >PowerDNS " VERSION;
185
+ if (!arg ()[" config-name" ].empty ()) {
186
+ ret<<" [" <<arg ()[" config-name" ]<<" ]" ;
187
+ }
188
+ ret<<" </a></div>" <<endl;
189
+ ret<<" <div class=\" headr columns\" ></div></div>" ;
190
+ ret<<" <div class=\" row\" ><div class=\" all columns\" >" ;
191
191
192
192
time_t passed=time (0 )-s_starttime;
193
193
@@ -221,7 +221,7 @@ string StatWebServer::indexfunction(const string& method, const string& post, co
221
221
sws->d_qcachemisses .get10 ()<<" . Max queries/second: " <<sws->d_qcachemisses .getMax ()<<
222
222
" <br>" <<endl;
223
223
224
- ret<<" Total queries: " <<S.read (" udp-queries" )<<" . Question/answer latency: " <<S.read (" latency" )/1000.0 <<" ms</p>" <<endl;
224
+ ret<<" Total queries: " <<S.read (" udp-queries" )<<" . Question/answer latency: " <<S.read (" latency" )/1000.0 <<" ms</p><br> " <<endl;
225
225
if (rvarmap[" ring" ].empty ()) {
226
226
vector<string>entries=S.listRings ();
227
227
for (vector<string>::const_iterator i=entries.begin ();i!=entries.end ();++i)
@@ -234,6 +234,8 @@ string StatWebServer::indexfunction(const string& method, const string& post, co
234
234
else
235
235
printtable (ret,rvarmap[" ring" ],S.getRingTitle (rvarmap[" ring" ]),100 );
236
236
237
+ ret<<" </div></div>" <<endl;
238
+ ret<<" <footer class=\" row\" >PowerDNS Authoritative Server " VERSION" . © 2013 <a href=\" http://www.powerdns.com/\" >PowerDNS.COM BV</a>.</footer>" <<endl;
237
239
ret<<" </body></html>" <<endl;
238
240
239
241
return ret.str ();
@@ -518,11 +520,52 @@ string StatWebServer::jsonstat(const string& method, const string& post, const m
518
520
return ret;
519
521
}
520
522
523
+ string StatWebServer::cssfunction (const string& method, const string& post, const map<string,string> &varmap, void *ptr, bool *custom)
524
+ {
525
+ *custom=1 ; // indicates we build the response
526
+ ostringstream ret;
527
+ ret<<" HTTP/1.1 200 OK\r\n "
528
+ " Server: PowerDNS/" VERSION" \r\n "
529
+ " Connection: close\r\n "
530
+ " Cache-Control: max-age=86400\r\n "
531
+ " Content-Type: text/css\r\n "
532
+ " \r\n " ;
533
+
534
+ ret<<" * { box-sizing: border-box; margin: 0; padding: 0; }" <<endl;
535
+ ret<<" body { color: black; background: white; margin-top: 1em; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 10pt; position: relative; }" <<endl;
536
+ ret<<" a { color: #0959c2; }" <<endl;
537
+ ret<<" a:hover { color: #3B8EC8; }" <<endl;
538
+ ret<<" .row { width: 940px; max-width: 100%; min-width: 768px; margin: 0 auto; }" <<endl;
539
+ ret<<" .row:before, .row:after { display: table; content:\" \" ; }" <<endl;
540
+ ret<<" .row:after { clear: both; }" <<endl;
541
+ ret<<" .columns { position: relative; min-height: 1px; float: left; }" <<endl;
542
+ ret<<" .all { width: 100%; }" <<endl;
543
+ ret<<" .headl { width: 60%; }" <<endl;
544
+ ret<<" .headr { width: 39.5%; float: right; background-repeat: no-repeat; margin-top: 7px; " ;
545
+ ret<<"background-image: url(data:image/png;base64,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);";
546
+ ret<<" width: 154px; height: 20px; }" <<endl;
547
+ ret<<" a#appname { margin: 0; font-size: 27px; color: #666; text-decoration: none; font-weight: bold; display: block; }" <<endl;
548
+ ret<<" footer { border-top: 1px solid #ddd; padding-top: 4px; font-size: 12px; }" <<endl;
549
+ ret<<" footer.row { margin-top: 1em; margin-bottom: 1em; }" <<endl;
550
+ ret<<" .panel { background: #f2f2f2; border: 1px solid #e6e6e6; margin: 0 0 22px 0; padding: 20px; }" <<endl;
551
+ ret<<" table.data { width: 100%; border-spacing: 0; border-top: 1px solid #333; }" <<endl;
552
+ ret<<" table.data td { border-bottom: 1px solid #333; padding: 2px; }" <<endl;
553
+ ret<<" table.data tr:nth-child(2n) { background: #e2e2e2; }" <<endl;
554
+ ret<<" table.data tr:hover { background: white; }" <<endl;
555
+ ret<<" .ringmeta { margin-bottom: 5px; }" <<endl;
556
+ ret<<" .resetring {float: right; }" <<endl;
557
+ ret<<" .resetring i { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAA/klEQVQY01XPP04UUBgE8N/33vd2XZUWEuzYuMZEG4KFCQn2NhA4AIewAOMBPIG2xhNYeAcKGqkNCdmYlVBZGBIT4FHsbuE0U8xk/kAbqm9TOfI/nicfhmwgDNhvylUT58kxCp4l31L8SfH9IetJ2ev6PwyIwyZWsdb11/gbTK55Co+r8rmJaRPTFJcpZil+pTit7C5awMpA+Zpi1sRFE9MqflYOloYCjY2uP8EdYiGU4CVGUBubxKfOOLjrtOBmzvEilbVb/aQWvhRl0unBZVXe4XdnK+bprwqnhoyTsyZ+JG8Wk0apfExxlcp7PFruXH8gdxamWB4cyW2sIO4BG3czIp78jUIAAAAASUVORK5CYII=); width: 10px; height: 10px; margin-right: 2px; display: inline-block; background-repeat: no-repeat; }" <<endl;
558
+ ret<<" .resetring:hover i { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAA2ElEQVQY013PMUoDcRDF4c+kEzxCsNNCrBQvIGhnlcYm11EkBxAraw8gglgIoiJpAoKIYlBcgrgopsma3c3fwt1k9cHA480M8xvQp/nMjorOWY5ov7IAYlpjQk7aYxcuWBpwFQgJnUcaYk7GhEDIGL5w+MVpKLIRyR2b4JOjvGhUKzHTv2W7iuSN479Dvu9plf1awbQ6y3x1sU5tjpVJcMbakF6Ycoas8Dl5xEHJ160wRdfqzXfa6XQ4PLDlicWUjxHxZfndL/N+RhiwNzl/Q6PDhn/qsl76H7prcApk2B1aAAAAAElFTkSuQmCC);}" <<endl;
559
+ ret<<" .resizering {float: right;}" <<endl;
560
+ return ret.str ();
561
+ }
562
+
521
563
void StatWebServer::launch ()
522
564
{
523
565
try {
524
566
d_ws->setCaller (this );
525
567
d_ws->registerHandler (" " ,&indexfunction);
568
+ d_ws->registerHandler (" style.css" ,&cssfunction);
526
569
if (::arg ().mustDo (" experimental-json-interface" ))
527
570
d_ws->registerHandler (" jsonstat" , &jsonstat);
528
571
d_ws->go ();
0 commit comments