summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/swat.c111
-rw-r--r--source3/web/swat.c111
2 files changed, 218 insertions, 4 deletions
diff --git a/source3/swat.c b/source3/swat.c
index ab9de41b19..09d0f08ea6 100644
--- a/source3/swat.c
+++ b/source3/swat.c
@@ -32,10 +32,18 @@
static pstring servicesf = CONFIGFILE;
+/* we need these because we link to locking*.o */
+ void become_root(BOOL save_dir) {}
+ void unbecome_root(BOOL restore_dir) {}
+connection_struct Connections[MAX_CONNECTIONS];
+files_struct Files[MAX_OPEN_FILES];
+struct current_user current_user;
+
+
/* start the page with standard stuff */
static void print_header(void)
{
- printf("Expires: %s\r\n", http_timestring(time(NULL)));
+ printf("Expires: 0\r\n");
printf("Content-type: text/html\r\n\r\n");
printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
printf("<HTML>\n<HEAD>\n<TITLE>Samba Web Administration Tool</TITLE>\n</HEAD>\n<BODY>\n\n");
@@ -70,7 +78,7 @@ static void include_html(char *fname)
}
-/* display one editable parameter */
+/* display one editable parameter in a form */
static void show_parameter(int snum, struct parm_struct *parm)
{
int i;
@@ -151,6 +159,7 @@ static void show_parameters(int snum, int allparameters, int advanced, int print
}
+/* save and reoad the smb.conf config file */
static int save_reload(void)
{
FILE *f;
@@ -223,6 +232,7 @@ static void show_main_buttons(void)
image_link("Globals", "globals", "images/globals.gif", 50, 50);
image_link("Shares", "shares", "images/shares.gif", 50, 50);
image_link("Printers", "printers", "images/printers.gif", 50, 50);
+ image_link("Status", "status", "images/status.gif", 50, 50);
printf("<HR>\n");
}
@@ -427,6 +437,101 @@ 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;
+
+ printf("<H2>Server Status</H2>\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("\nSamba version %s\n<p>",VERSION);
+
+ printf("<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);
+}
+
+
int main(int argc, char *argv[])
{
extern char *optarg;
@@ -477,6 +582,8 @@ int main(int argc, char *argv[])
shares_page();
} else if (strcmp(page,"printers")==0) {
printers_page();
+ } else if (strcmp(page,"status")==0) {
+ status_page();
} else {
welcome_page();
}
diff --git a/source3/web/swat.c b/source3/web/swat.c
index ab9de41b19..09d0f08ea6 100644
--- a/source3/web/swat.c
+++ b/source3/web/swat.c
@@ -32,10 +32,18 @@
static pstring servicesf = CONFIGFILE;
+/* we need these because we link to locking*.o */
+ void become_root(BOOL save_dir) {}
+ void unbecome_root(BOOL restore_dir) {}
+connection_struct Connections[MAX_CONNECTIONS];
+files_struct Files[MAX_OPEN_FILES];
+struct current_user current_user;
+
+
/* start the page with standard stuff */
static void print_header(void)
{
- printf("Expires: %s\r\n", http_timestring(time(NULL)));
+ printf("Expires: 0\r\n");
printf("Content-type: text/html\r\n\r\n");
printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
printf("<HTML>\n<HEAD>\n<TITLE>Samba Web Administration Tool</TITLE>\n</HEAD>\n<BODY>\n\n");
@@ -70,7 +78,7 @@ static void include_html(char *fname)
}
-/* display one editable parameter */
+/* display one editable parameter in a form */
static void show_parameter(int snum, struct parm_struct *parm)
{
int i;
@@ -151,6 +159,7 @@ static void show_parameters(int snum, int allparameters, int advanced, int print
}
+/* save and reoad the smb.conf config file */
static int save_reload(void)
{
FILE *f;
@@ -223,6 +232,7 @@ static void show_main_buttons(void)
image_link("Globals", "globals", "images/globals.gif", 50, 50);
image_link("Shares", "shares", "images/shares.gif", 50, 50);
image_link("Printers", "printers", "images/printers.gif", 50, 50);
+ image_link("Status", "status", "images/status.gif", 50, 50);
printf("<HR>\n");
}
@@ -427,6 +437,101 @@ 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;
+
+ printf("<H2>Server Status</H2>\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("\nSamba version %s\n<p>",VERSION);
+
+ printf("<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);
+}
+
+
int main(int argc, char *argv[])
{
extern char *optarg;
@@ -477,6 +582,8 @@ int main(int argc, char *argv[])
shares_page();
} else if (strcmp(page,"printers")==0) {
printers_page();
+ } else if (strcmp(page,"status")==0) {
+ status_page();
} else {
welcome_page();
}