diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-03-15 02:37:52 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-03-15 02:37:52 +0000 |
commit | abd4a17e21d12be3d1747e94ceb1915abaf135e3 (patch) | |
tree | a58c8c7f2650ef1b9c285abbc6eba75e7f0fcedc /source/web | |
parent | 02cb3801d772cc056df3afb7028d9bd74c8553be (diff) | |
download | samba-abd4a17e21d12be3d1747e94ceb1915abaf135e3.tar.gz |
- added the ability to kill off individual connections from SWAT (from
the status page)
- split the claim_connection() code into its own file
- fixed the claim_connection() code to lock the file when manipulating
it
- always claim a null connection at startup
- fixed a bug in the pidfile code
Diffstat (limited to 'source/web')
-rw-r--r-- | source/web/startstop.c | 11 | ||||
-rw-r--r-- | source/web/statuspage.c | 194 | ||||
-rw-r--r-- | source/web/swat.c | 137 |
3 files changed, 205 insertions, 137 deletions
diff --git a/source/web/startstop.c b/source/web/startstop.c index 19781cc2200..e60b13ae669 100644 --- a/source/web/startstop.c +++ b/source/web/startstop.c @@ -91,3 +91,14 @@ void stop_nmbd(void) kill(pid, SIGTERM); } + +/* kill a specified process */ +void kill_pid(int pid) +{ + if (geteuid() != 0) return; + + if (pid <= 0) return; + + kill(pid, SIGTERM); + sleep(SLEEP_TIME); +} diff --git a/source/web/statuspage.c b/source/web/statuspage.c new file mode 100644 index 00000000000..3a95d99d374 --- /dev/null +++ b/source/web/statuspage.c @@ -0,0 +1,194 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + web status page + Copyright (C) Andrew Tridgell 1997-1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + + +static void print_share_mode(share_mode_entry *e, char *fname) +{ + printf("<tr><td>%d</td>",e->pid); + printf("<td>"); + switch ((e->share_mode>>4)&0xF) { + case DENY_NONE: printf("DENY_NONE"); break; + case DENY_ALL: printf("DENY_ALL "); break; + case DENY_DOS: printf("DENY_DOS "); break; + case DENY_READ: printf("DENY_READ "); break; + case DENY_WRITE:printf("DENY_WRITE "); break; + } + printf("</td>"); + + printf("<td>"); + switch (e->share_mode&0xF) { + case 0: printf("RDONLY "); break; + case 1: printf("WRONLY "); break; + case 2: printf("RDWR "); break; + } + printf("</td>"); + + printf("<td>"); + if((e->op_type & + (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == + (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) + printf("EXCLUSIVE+BATCH "); + else if (e->op_type & EXCLUSIVE_OPLOCK) + printf("EXCLUSIVE "); + else if (e->op_type & BATCH_OPLOCK) + printf("BATCH "); + else + printf("NONE "); + printf("</td>"); + + printf("<td>%s</td><td>%s</td></tr>\n", + fname,asctime(LocalTime((time_t *)&e->time.tv_sec))); +} + + +/* show the current server status */ +void status_page(void) +{ + struct connect_record crec; + pstring fname; + FILE *f; + int i, pid; + char *v; + + if (cgi_variable("smbd_start")) { + start_smbd(); + } + + if (cgi_variable("smbd_stop")) { + stop_smbd(); + } + + if (cgi_variable("nmbd_start")) { + start_nmbd(); + } + + if (cgi_variable("nmbd_stop")) { + stop_nmbd(); + } + + for (i=0;cgi_vnum(i, &v); i++) { + if (strncmp(v, "kill_", 5) != 0) continue; + pid = atoi(v+5); + if (pid > 0) { + printf("killing %d<br>\n", pid); + kill_pid(pid); + } + } + + + printf("<H2>Server Status</H2>\n"); + + printf("<FORM method=post>\n"); + + pstrcpy(fname,lp_lockdir()); + standard_sub_basic(fname); + trim_string(fname,"","/"); + strcat(fname,"/STATUS..LCK"); + + f = fopen(fname,"r"); + if (!f) { + printf("Couldn't open status file %s\n",fname); + if (!lp_status(-1)) + printf("You need to have status=yes in your smb config file\n"); + return; + } + + + printf("<table>\n"); + + printf("<tr><td>version:</td><td>%s</td></tr>",VERSION); + + fflush(stdout); + if (smbd_running()) { + printf("<tr><td>smbd:</td><td>running</td><td><input type=submit name=\"smbd_stop\" value=\"Stop smbd\"></td></tr>\n"); + } else { + printf("<tr><td>smbd:</td><td>not running</td><td><input type=submit name=\"smbd_start\" value=\"Start smbd\"></td></tr>\n"); + } + + fflush(stdout); + if (nmbd_running()) { + printf("<tr><td>nmbd:</td><td>running</td><td><input type=submit name=\"nmbd_stop\" value=\"Stop nmbd\"></td></tr>\n"); + } else { + printf("<tr><td>nmbd:</td><td>not running</td><td><input type=submit name=\"nmbd_start\" value=\"Start nmbd\"></td></tr>\n"); + } + + printf("</table>\n"); + fflush(stdout); + + + if (geteuid() != 0) + printf("<b>NOTE: You are not logged in as root and won't be able to start/stop the server</b><p>\n"); + + printf("<p><h3>Active Connections</h3>\n"); + printf("<table border=1>\n"); + printf("<tr><th>PID</th><th>Client</th><th>IP address</th><th>Date</th><th>Kill</th></tr>\n"); + + while (!feof(f)) { + if (fread(&crec,sizeof(crec),1,f) != 1) + break; + if (crec.magic == 0x280267 && process_exists(crec.pid)) { + printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td><input type=submit value=\"X\" name=\"kill_%d\"></td></tr>\n", + crec.pid, + crec.machine,crec.addr, + asctime(LocalTime(&crec.start)), + crec.pid); + } + } + + printf("</table><p>\n"); + + fseek(f, 0, SEEK_SET); + + printf("<p><h3>Active Shares</h3>\n"); + printf("<table border=1>\n"); + printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n"); + + while (!feof(f)) { + if (fread(&crec,sizeof(crec),1,f) != 1) + break; + if (crec.cnum == -1) continue; + if (crec.magic == 0x280267 && process_exists(crec.pid)) { + printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>\n", + crec.name,uidtoname(crec.uid), + gidtoname(crec.gid),crec.pid, + crec.machine, + asctime(LocalTime(&crec.start))); + } + } + + printf("</table><p>\n"); + + printf("<h3>Open Files</h3>\n"); + printf("<table border=1>\n"); + printf("<tr><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>File</th><th>Date</th></tr>\n"); + + locking_init(1); + share_mode_forall(print_share_mode); + locking_end(); + printf("</table>\n"); + + fclose(f); + + printf("</FORM>\n"); +} + diff --git a/source/web/swat.c b/source/web/swat.c index d9f890ce139..1a12d99ffd3 100644 --- a/source/web/swat.c +++ b/source/web/swat.c @@ -491,143 +491,6 @@ static void printers_page(void) } -static void print_share_mode(share_mode_entry *e, char *fname) -{ - printf("<tr><td>%d</td>",e->pid); - printf("<td>"); - switch ((e->share_mode>>4)&0xF) { - case DENY_NONE: printf("DENY_NONE"); break; - case DENY_ALL: printf("DENY_ALL "); break; - case DENY_DOS: printf("DENY_DOS "); break; - case DENY_READ: printf("DENY_READ "); break; - case DENY_WRITE:printf("DENY_WRITE "); break; - } - printf("</td>"); - - printf("<td>"); - switch (e->share_mode&0xF) { - case 0: printf("RDONLY "); break; - case 1: printf("WRONLY "); break; - case 2: printf("RDWR "); break; - } - printf("</td>"); - - printf("<td>"); - if((e->op_type & - (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == - (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) - printf("EXCLUSIVE+BATCH "); - else if (e->op_type & EXCLUSIVE_OPLOCK) - printf("EXCLUSIVE "); - else if (e->op_type & BATCH_OPLOCK) - printf("BATCH "); - else - printf("NONE "); - printf("</td>"); - - printf("<td>%s</td><td>%s</td></tr>\n", - fname,asctime(LocalTime((time_t *)&e->time.tv_sec))); -} - - -/* show the current server status */ -static void status_page(void) -{ - struct connect_record crec; - pstring fname; - FILE *f; - - if (cgi_variable("smbd_start")) { - start_smbd(); - } - - if (cgi_variable("smbd_stop")) { - stop_smbd(); - } - - if (cgi_variable("nmbd_start")) { - start_nmbd(); - } - - if (cgi_variable("nmbd_stop")) { - stop_nmbd(); - } - - printf("<H2>Server Status</H2>\n"); - - printf("<FORM method=post>\n"); - - pstrcpy(fname,lp_lockdir()); - standard_sub_basic(fname); - trim_string(fname,"","/"); - strcat(fname,"/STATUS..LCK"); - - f = fopen(fname,"r"); - if (!f) { - printf("Couldn't open status file %s\n",fname); - if (!lp_status(-1)) - printf("You need to have status=yes in your smb config file\n"); - return; - } - - - printf("<table>\n"); - - printf("<tr><td>version:</td><td>%s</td></tr>",VERSION); - - fflush(stdout); - if (smbd_running()) { - printf("<tr><td>smbd:</td><td>running</td><td><input type=submit name=\"smbd_stop\" value=\"Stop smbd\"></td></tr>\n"); - } else { - printf("<tr><td>smbd:</td><td>not running</td><td><input type=submit name=\"smbd_start\" value=\"Start smbd\"></td></tr>\n"); - } - - fflush(stdout); - if (nmbd_running()) { - printf("<tr><td>nmbd:</td><td>running</td><td><input type=submit name=\"nmbd_stop\" value=\"Stop nmbd\"></td></tr>\n"); - } else { - printf("<tr><td>nmbd:</td><td>not running</td><td><input type=submit name=\"nmbd_start\" value=\"Start nmbd\"></td></tr>\n"); - } - - printf("</table>\n"); - fflush(stdout); - - - if (geteuid() != 0) - printf("<b>NOTE: You are not logged in as root and won't be able to start/stop the server</b><p>\n"); - - printf("<p><h3>Active Connections</h3>\n"); - printf("<table border=1>\n"); - printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n"); - - while (!feof(f)) { - if (fread(&crec,sizeof(crec),1,f) != 1) - break; - if (crec.magic == 0x280267 && process_exists(crec.pid)) { - printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s (%s)</td><td>%s</td></tr>\n", - crec.name,uidtoname(crec.uid), - gidtoname(crec.gid),crec.pid, - crec.machine,crec.addr, - asctime(LocalTime(&crec.start))); - } - } - - printf("</table><p>\n"); - - printf("<h3>Open Files</h3>\n"); - printf("<table border=1>\n"); - printf("<tr><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>File</th><th>Date</th></tr>\n"); - - locking_init(1); - share_mode_forall(print_share_mode); - locking_end(); - printf("</table>\n"); - - fclose(f); - - printf("</FORM>\n"); -} - int main(int argc, char *argv[]) { |