aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/srv/httpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/venti/srv/httpd.c')
-rw-r--r--src/cmd/venti/srv/httpd.c288
1 files changed, 150 insertions, 138 deletions
diff --git a/src/cmd/venti/srv/httpd.c b/src/cmd/venti/srv/httpd.c
index 04d19d9d..e71bd436 100644
--- a/src/cmd/venti/srv/httpd.c
+++ b/src/cmd/venti/srv/httpd.c
@@ -36,7 +36,6 @@ static int hicachekick(HConnect *c);
static int hdcachekick(HConnect *c);
static int hicacheflush(HConnect *c);
static int hdcacheflush(HConnect *c);
-static int notfound(HConnect *c);
static int httpdobj(char *name, int (*f)(HConnect*));
static int xgraph(HConnect *c);
static int xset(HConnect *c);
@@ -61,15 +60,15 @@ httpdinit(char *address, char *dir)
httpdobj("/flushdcache", hdcacheflush);
httpdobj("/kickicache", hicachekick);
httpdobj("/kickdcache", hdcachekick);
- httpdobj("/graph/", xgraph);
+ httpdobj("/graph", xgraph);
httpdobj("/set", xset);
- httpdobj("/set/", xset);
httpdobj("/log", xlog);
- httpdobj("/log/", xlog);
httpdobj("/empty", hempty);
httpdobj("/emptyicache", hicacheempty);
httpdobj("/emptylumpcache", hlcacheempty);
httpdobj("/emptydcache", hdcacheempty);
+ httpdobj("/disk", hdisk);
+ httpdobj("/debug", hdebug);
if(vtproc(listenproc, address) < 0)
return -1;
@@ -168,6 +167,11 @@ httpproc(void *v)
*/
if(hparsereq(c, 0) < 0)
break;
+
+ if(c->req.search)
+ c->req.searchpairs = hparsequery(c, c->req.search);
+ else
+ c->req.searchpairs = nil;
for(i = 0; i < MaxObjs && objs[i].name[0]; i++){
n = strlen(objs[i].name);
@@ -179,6 +183,7 @@ httpproc(void *v)
}
ok = fromwebdir(c);
found:
+ hflush(&c->hout);
if(c->head.closeit)
ok = -1;
hreqcleanup(c);
@@ -191,6 +196,27 @@ httpproc(void *v)
free(c);
}
+char*
+hargstr(HConnect *c, char *name, char *def)
+{
+ HSPairs *p;
+
+ for(p=c->req.searchpairs; p; p=p->next)
+ if(strcmp(p->s, name) == 0)
+ return p->t;
+ return def;
+}
+
+vlong
+hargint(HConnect *c, char *name, vlong def)
+{
+ char *a;
+
+ if((a = hargstr(c, name, nil)) == nil)
+ return def;
+ return atoll(a);
+}
+
static int
percent(ulong v, ulong total)
{
@@ -217,8 +243,8 @@ preq(HConnect *c)
return 0;
}
-static int
-preqtype(HConnect *c, char *type)
+int
+hsettype(HConnect *c, char *type)
{
Hio *hout;
int r;
@@ -243,10 +269,16 @@ preqtype(HConnect *c, char *type)
return 0;
}
-static int
-preqtext(HConnect *c)
+int
+hsethtml(HConnect *c)
+{
+ return hsettype(c, "text/html; charset=utf-8");
+}
+
+int
+hsettext(HConnect *c)
{
- return preqtype(c, "text/plain");
+ return hsettype(c, "text/plain; charset=utf-8");
}
static int
@@ -274,8 +306,8 @@ herror(HConnect *c)
return hflush(hout);
}
-static int
-notfound(HConnect *c)
+int
+hnotfound(HConnect *c)
{
int r;
@@ -305,16 +337,16 @@ fromwebdir(HConnect *c)
Dir *d;
if(webroot == nil || strstr(c->req.uri, ".."))
- return notfound(c);
+ return hnotfound(c);
snprint(buf, sizeof buf-20, "%s/%s", webroot, c->req.uri+1);
defaulted = 0;
reopen:
if((fd = open(buf, OREAD)) < 0)
- return notfound(c);
+ return hnotfound(c);
d = dirfstat(fd);
if(d == nil){
close(fd);
- return notfound(c);
+ return hnotfound(c);
}
if(d->mode&DMDIR){
if(!defaulted){
@@ -325,7 +357,7 @@ reopen:
goto reopen;
}
free(d);
- return notfound(c);
+ return hnotfound(c);
}
free(d);
p = buf+strlen(buf);
@@ -337,7 +369,7 @@ reopen:
break;
}
}
- if(preqtype(c, type) < 0){
+ if(hsettype(c, type) < 0){
close(fd);
return 0;
}
@@ -372,54 +404,41 @@ static struct
};
static int
-xsetlist(HConnect *c)
-{
- int i;
-
- if(preqtype(c, "text/plain") < 0)
- return -1;
- for(i=0; namedints[i].name; i++)
- print("%s = %d\n", namedints[i].name, *namedints[i].p);
- hflush(&c->hout);
- return 0;
-}
-
-
-
-static int
xset(HConnect *c)
{
- int i, nf, r;
- char *f[10], *s;
+ int i, old;
+ char *name, *value;
- if(strcmp(c->req.uri, "/set") == 0 || strcmp(c->req.uri, "/set/") == 0)
- return xsetlist(c);
-
- s = estrdup(c->req.uri);
- nf = getfields(s+strlen("/set/"), f, nelem(f), 1, "/");
+ if(hsettext(c) < 0)
+ return -1;
- if(nf < 1){
- r = preqtext(c);
- if(r < 0)
- return r;
+ if((name = hargstr(c, "name", nil)) == nil || name[0] == 0){
for(i=0; namedints[i].name; i++)
hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
hflush(&c->hout);
return 0;
}
- for(i=0; namedints[i].name; i++){
- if(strcmp(f[0], namedints[i].name) == 0){
- if(nf >= 2)
- *namedints[i].p = atoi(f[1]);
- r = preqtext(c);
- if(r < 0)
- return r;
- hprint(&c->hout, "%s = %d\n", f[0], *namedints[i].p);
- hflush(&c->hout);
- return 0;
- }
+
+ for(i=0; namedints[i].name; i++)
+ if(strcmp(name, namedints[i].name) == 0)
+ break;
+ if(!namedints[i].name){
+ hprint(&c->hout, "%s not found\n", name);
+ hflush(&c->hout);
+ return 0;
+ }
+
+ if((value = hargstr(c, "value", nil)) == nil || value[0] == 0){
+ hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
+ hflush(&c->hout);
+ return 0;
}
- return notfound(c);
+
+ old = *namedints[i].p;
+ *namedints[i].p = atoll(value);
+ hprint(&c->hout, "%s = %d (was %d)\n", name, *namedints[i].p, old);
+ hflush(&c->hout);
+ return 0;
}
static int
@@ -428,7 +447,7 @@ estats(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
@@ -503,7 +522,7 @@ sindex(HConnect *c)
vlong clumps, cclumps, uncsize, used, size;
int i, r, active;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -567,7 +586,7 @@ hempty(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -586,7 +605,7 @@ hlcacheempty(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -603,7 +622,7 @@ hicacheempty(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -620,7 +639,7 @@ hdcacheempty(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -636,7 +655,7 @@ hicachekick(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -653,7 +672,7 @@ hdcachekick(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -669,7 +688,7 @@ hicacheflush(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -686,7 +705,7 @@ hdcacheflush(HConnect *c)
Hio *hout;
int r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -704,7 +723,7 @@ dindex(HConnect *c)
Index *ix;
int i, r;
- r = preqtext(c);
+ r = hsettext(c);
if(r < 0)
return r;
hout = &c->hout;
@@ -772,6 +791,23 @@ pctdiffgraph(Stats *s, Stats *t, void *va)
}
static long
+div(long a, long b)
+{
+ if(b == 0)
+ b++;
+ return a/b;
+}
+
+static long
+divdiffgraph(Stats *s, Stats *t, void *va)
+{
+ Arg *a;
+
+ a = va;
+ return div(t->n[a->index] - s->n[a->index], t->n[a->index2] - s->n[a->index2]);
+}
+
+static long
netbw(Stats *s)
{
ulong *n;
@@ -928,79 +964,59 @@ dotextbin(Hio *io, Graph *g)
static int
xgraph(HConnect *c)
{
- char *f[20], *s;
+ char *name;
Hio *hout;
Memimage *m;
- int i, nf, dotext;
+ int dotext;
Graph g;
Arg arg;
+ char *graph, *a;
- s = estrdup(c->req.uri);
-if(0) fprint(2, "graph %s\n" ,s);
- memset(&g, 0, sizeof g);
- nf = getfields(s+strlen("/graph/"), f, nelem(f), 1, "/");
- if(nf < 1){
- werrstr("bad syntax -- not enough fields");
+ name = hargstr(c, "arg", "");
+ if((arg.index = findname(name)) == -1 && strcmp(name, "*") != 0){
+ werrstr("unknown name %s", name);
goto error;
}
- if((arg.index = findname(f[0])) == -1 && strcmp(f[0], "*") != 0){
- werrstr("unknown name %s", f[0]);
+ a = hargstr(c, "arg2", "");
+ if(a[0] && (arg.index2 = findname(a)) == -1){
+ werrstr("unknown name %s", a);
goto error;
}
+
g.arg = &arg;
- g.t0 = -120;
- g.t1 = 0;
- g.min = -1;
- g.max = -1;
- g.fn = rawgraph;
- g.wid = -1;
- g.ht = -1;
- dotext = 0;
- g.fill = -1;
- for(i=1; i<nf; i++){
- if(strncmp(f[i], "t0=", 3) == 0)
- g.t0 = atoi(f[i]+3);
- else if(strncmp(f[i], "t1=", 3) == 0)
- g.t1 = atoi(f[i]+3);
- else if(strncmp(f[i], "min=", 4) == 0)
- g.min = atoi(f[i]+4);
- else if(strncmp(f[i], "max=", 4) == 0)
- g.max = atoi(f[i]+4);
- else if(strncmp(f[i], "pct=", 4) == 0){
- if((arg.index2 = findname(f[i]+4)) == -1){
- werrstr("unknown name %s", f[i]+4);
- goto error;
- }
- g.fn = pctgraph;
- g.min = 0;
- g.max = 100;
- }else if(strncmp(f[i], "pctdiff=", 8) == 0){
- if((arg.index2 = findname(f[i]+8)) == -1){
- werrstr("unknown name %s", f[i]+8);
- goto error;
- }
- g.fn = pctdiffgraph;
- g.min = 0;
- g.max = 100;
- }else if(strcmp(f[i], "diff") == 0)
- g.fn = diffgraph;
- else if(strcmp(f[i], "text") == 0)
- dotext = 1;
- else if(strncmp(f[i], "wid=", 4) == 0)
- g.wid = atoi(f[i]+4);
- else if(strncmp(f[i], "ht=", 3) == 0)
- g.ht = atoi(f[i]+3);
- else if(strncmp(f[i], "fill=", 5) == 0)
- g.fill = atoi(f[i]+5);
- else if(strcmp(f[i], "diskbw") == 0)
- g.fn = diskgraph;
- else if(strcmp(f[i], "iobw") == 0)
- g.fn = iograph;
- else if(strcmp(f[i], "netbw") == 0)
- g.fn = netgraph;
+ g.t0 = hargint(c, "t0", -120);
+ g.t1 = hargint(c, "t1", 0);
+ g.min = hargint(c, "min", -1);
+ g.max = hargint(c, "max", -1);
+ g.wid = hargint(c, "wid", -1);
+ g.ht = hargint(c, "ht", -1);
+ dotext = hargstr(c, "text", "")[0] != 0;
+ g.fill = hargint(c, "fill", -1);
+
+ graph = hargstr(c, "graph", "raw");
+ if(strcmp(graph, "raw") == 0)
+ g.fn = rawgraph;
+ else if(strcmp(graph, "diskbw") == 0)
+ g.fn = diskgraph;
+ else if(strcmp(graph, "iobw") == 0)
+ g.fn = iograph;
+ else if(strcmp(graph, "netbw") == 0)
+ g.fn = netgraph;
+ else if(strcmp(graph, "diff") == 0)
+ g.fn = diffgraph;
+ else if(strcmp(graph, "pct") == 0)
+ g.fn = pctgraph;
+ else if(strcmp(graph, "pctdiff") == 0)
+ g.fn = pctdiffgraph;
+ else if(strcmp(graph, "divdiff") == 0)
+ g.fn = divdiffgraph;
+ else{
+ werrstr("unknown graph %s", graph);
+ goto error;
}
+
if(dotext){
- preqtype(c, "text/plain");
+ hsettype(c, "text/plain");
dotextbin(&c->hout, &g);
hflush(&c->hout);
return 0;
@@ -1010,7 +1026,7 @@ if(0) fprint(2, "graph %s\n" ,s);
if(m == nil)
goto error;
- if(preqtype(c, "image/png") < 0)
+ if(hsettype(c, "image/png") < 0)
return -1;
hout = &c->hout;
writepng(hout, m);
@@ -1018,18 +1034,16 @@ if(0) fprint(2, "graph %s\n" ,s);
freememimage(m);
qunlock(&memdrawlock);
hflush(hout);
- free(s);
return 0;
error:
- free(s);
return herror(c);
}
static int
xloglist(HConnect *c)
{
- if(preqtype(c, "text/html") < 0)
+ if(hsettype(c, "text/html") < 0)
return -1;
vtloghlist(&c->hout);
hflush(&c->hout);
@@ -1042,15 +1056,13 @@ xlog(HConnect *c)
char *name;
VtLog *l;
- if(strcmp(c->req.uri, "/log") == 0 || strcmp(c->req.uri, "/log/") == 0)
+ name = hargstr(c, "log", "");
+ if(!name[0])
return xloglist(c);
- if(strncmp(c->req.uri, "/log/", 5) != 0)
- return notfound(c);
- name = c->req.uri + strlen("/log/");
l = vtlogopen(name, 0);
if(l == nil)
- return notfound(c);
- if(preqtype(c, "text/html") < 0){
+ return hnotfound(c);
+ if(hsettype(c, "text/html") < 0){
vtlogclose(l);
return -1;
}
@@ -1063,7 +1075,7 @@ xlog(HConnect *c)
static int
xindex(HConnect *c)
{
- if(preqtype(c, "text/xml") < 0)
+ if(hsettype(c, "text/xml") < 0)
return -1;
xmlindex(&c->hout, mainindex, "index", 0);
hflush(&c->hout);
@@ -1158,7 +1170,7 @@ vtloghlist(Hio *h)
p = vtlognames(&n);
qsort(p, n, sizeof(p[0]), strpcmp);
for(i=0; i<n; i++)
- hprint(h, "<a href=\"/log/%s\">%s</a><br>\n", p[i], p[i]);
+ hprint(h, "<a href=\"/log?log=%s\">%s</a><br>\n", p[i], p[i]);
vtfree(p);
hprint(h, "</body></html>\n");
}