| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include "dat.h" |
| |
| Biobuf bout; |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: auxstats [system [executable]]\n"); |
| exits("usage"); |
| } |
| |
| int pid; |
| |
| void |
| notifyf(void *v, char *msg) |
| { |
| USED(v); |
| |
| if(strstr(msg, "child")) |
| noted(NCONT); |
| postnote(PNPROC, pid, msg); |
| exits(nil); |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| char *sys, *exe; |
| int i; |
| Waitmsg *w; |
| |
| ARGBEGIN{ |
| default: |
| usage(); |
| }ARGEND |
| |
| notify(notifyf); |
| |
| sys = nil; |
| exe = nil; |
| if(argc > 0) |
| sys = argv[0]; |
| if(argc > 1) |
| exe = argv[1]; |
| if(argc > 2) |
| usage(); |
| |
| if(sys){ |
| if(exe == nil) |
| exe = "auxstats"; |
| for(;;){ |
| switch(pid = fork()){ |
| case -1: |
| sysfatal("fork: %r"); |
| case 0: |
| rfork(RFNOTEG); |
| execlp("ssh", "ssh", "-nTC", sys, exe, nil); |
| _exit(97); |
| default: |
| if((w = wait()) == nil) |
| sysfatal("wait: %r"); |
| if(w->pid != pid) |
| sysfatal("wait got wrong pid"); |
| if(atoi(w->msg) == 97) |
| sysfatal("exec ssh failed"); |
| free(w); |
| fprint(2, "stats: %s hung up; sleeping 60\n", sys); |
| sleep(60*1000); |
| fprint(2, "stats: redialing %s\n", sys); |
| break; |
| } |
| } |
| } |
| |
| for(i=0; statfn[i]; i++) |
| statfn[i](1); |
| |
| Binit(&bout, 1, OWRITE); |
| for(;;){ |
| Bflush(&bout); |
| sleep(900); |
| for(i=0; statfn[i]; i++) |
| statfn[i](0); |
| } |
| } |
| |
| char buf[16384]; |
| char *line[100]; |
| char *tok[100]; |
| int nline, ntok; |
| |
| void |
| readfile(int fd) |
| { |
| int n; |
| |
| if(fd == -1){ |
| nline = 0; |
| return; |
| } |
| |
| seek(fd, 0, 0); |
| n = read(fd, buf, sizeof buf-1); |
| if(n < 0) |
| n = 0; |
| buf[n] = 0; |
| |
| nline = getfields(buf, line, nelem(line), 0, "\n"); |
| } |
| |
| void |
| tokens(int i) |
| { |
| if(i >= nline){ |
| ntok = 0; |
| return; |
| } |
| ntok = tokenize(line[i], tok, nelem(tok)); |
| } |
| |