summaryrefslogtreecommitdiff
path: root/source/web
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-03-15 02:37:52 +0000
committerAndrew Tridgell <tridge@samba.org>1998-03-15 02:37:52 +0000
commitabd4a17e21d12be3d1747e94ceb1915abaf135e3 (patch)
treea58c8c7f2650ef1b9c285abbc6eba75e7f0fcedc /source/web
parent02cb3801d772cc056df3afb7028d9bd74c8553be (diff)
downloadsamba-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.c11
-rw-r--r--source/web/statuspage.c194
-rw-r--r--source/web/swat.c137
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[])
{