- added "Full View"/"Normal View" on the "view config" page
[sfrench/samba-autobuild/.git] / source3 / web / statuspage.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    web status page
5    Copyright (C) Andrew Tridgell 1997-1998
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24
25 static char *tstring(time_t t)
26 {
27         static pstring buf;
28         pstrcpy(buf, asctime(LocalTime(&t)));
29         string_sub(buf," "," ");
30         return buf;
31 }
32
33 static void print_share_mode(share_mode_entry *e, char *fname)
34 {
35         printf("<tr><td>%d</td>",e->pid);
36         printf("<td>");
37         switch ((e->share_mode>>4)&0xF) {
38         case DENY_NONE: printf("DENY_NONE"); break;
39         case DENY_ALL:  printf("DENY_ALL   "); break;
40         case DENY_DOS:  printf("DENY_DOS   "); break;
41         case DENY_READ: printf("DENY_READ  "); break;
42         case DENY_WRITE:printf("DENY_WRITE "); break;
43         }
44         printf("</td>");
45
46         printf("<td>");
47         switch (e->share_mode&0xF) {
48         case 0: printf("RDONLY     "); break;
49         case 1: printf("WRONLY     "); break;
50         case 2: printf("RDWR       "); break;
51         }
52         printf("</td>");
53
54         printf("<td>");
55         if((e->op_type & 
56             (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == 
57            (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
58                 printf("EXCLUSIVE+BATCH ");
59         else if (e->op_type & EXCLUSIVE_OPLOCK)
60                 printf("EXCLUSIVE       ");
61         else if (e->op_type & BATCH_OPLOCK)
62                 printf("BATCH           ");
63         else
64                 printf("NONE            ");
65         printf("</td>");
66
67         printf("<td>%s</td><td>%s</td></tr>\n",
68                fname,tstring(e->time.tv_sec));
69 }
70
71
72 /* show the current server status */
73 void status_page(void)
74 {
75         struct connect_record crec;
76         pstring fname;
77         FILE *f;
78         char *v;
79         int autorefresh=0;
80         int refresh_interval=30;
81
82         if (cgi_variable("smbd_start")) {
83                 start_smbd();
84         }
85
86         if (cgi_variable("smbd_stop")) {
87                 stop_smbd();
88         }
89
90         if (cgi_variable("nmbd_start")) {
91                 start_nmbd();
92         }
93
94         if (cgi_variable("nmbd_stop")) {
95                 stop_nmbd();
96         }
97
98         if (cgi_variable("autorefresh")) {
99                 autorefresh = 1;
100         } else if (cgi_variable("norefresh")) {
101                 autorefresh = 0;
102         } else if (cgi_variable("refresh")) {
103                 autorefresh = 1;
104         }
105
106         if ((v=cgi_variable("refresh_interval"))) {
107                 refresh_interval = atoi(v);
108         }
109
110         if (autorefresh) {
111                 printf("<META HTTP-EQUIV=refresh CONTENT=\"%d;URL=%s/status?refresh=1&refresh_interval=%d\">\n", 
112                        refresh_interval, cgi_baseurl(), refresh_interval);
113         }
114
115         pstrcpy(fname,lp_lockdir());
116         standard_sub_basic(fname);
117         trim_string(fname,"","/");
118         strcat(fname,"/STATUS..LCK");
119
120
121         f = fopen(fname,"r");
122         if (f) {
123                 while (!feof(f)) {
124                         if (fread(&crec,sizeof(crec),1,f) != 1) break;
125                         if (crec.magic == 0x280267 && crec.cnum == -1 &&
126                             process_exists(crec.pid)) {
127                                 char buf[30];
128                                 sprintf(buf,"kill_%d", crec.pid);
129                                 if (cgi_variable(buf)) {
130                                         kill_pid(crec.pid);
131                                 }
132                         }
133                 }
134                 fclose(f);
135         }
136
137         printf("<H2>Server Status</H2>\n");
138
139         printf("<FORM method=post>\n");
140
141         if (!autorefresh) {
142                 printf("<input type=submit value=\"Auto Refresh\" name=autorefresh>\n");
143                 printf("<br>Refresh Interval: ");
144                 printf("<input type=text size=2 name=\"refresh_interval\" value=%d>\n", 
145                        refresh_interval);
146         } else {
147                 printf("<input type=submit value=\"Stop Refreshing\" name=norefresh>\n");
148                 printf("<br>Refresh Interval: %d\n", refresh_interval);
149                 printf("<input type=hidden name=refresh value=1>\n");
150         }
151
152         printf("<p>\n");
153
154         f = fopen(fname,"r");
155         if (!f) {
156                 printf("Couldn't open status file %s\n",fname);
157                 if (!lp_status(-1))
158                         printf("You need to have status=yes in your smb config file\n");
159                 return;
160         }
161
162
163         printf("<table>\n");
164
165         printf("<tr><td>version:</td><td>%s</td></tr>",VERSION);
166
167         fflush(stdout);
168         if (smbd_running()) {
169                 printf("<tr><td>smbd:</td><td>running</td><td><input type=submit name=\"smbd_stop\" value=\"Stop smbd\"></td></tr>\n");
170         } else {
171                 printf("<tr><td>smbd:</td><td>not running</td><td><input type=submit name=\"smbd_start\" value=\"Start smbd\"></td></tr>\n");
172         }
173
174         fflush(stdout);
175         if (nmbd_running()) {
176                 printf("<tr><td>nmbd:</td><td>running</td><td><input type=submit name=\"nmbd_stop\" value=\"Stop nmbd\"></td></tr>\n");
177         } else {
178                 printf("<tr><td>nmbd:</td><td>not running</td><td><input type=submit name=\"nmbd_start\" value=\"Start nmbd\"></td></tr>\n");
179         }
180
181         printf("</table>\n");
182         fflush(stdout);
183
184
185         if (geteuid() != 0)
186                 printf("<b>NOTE: You are not logged in as root and won't be able to start/stop the server</b><p>\n");
187
188         printf("<p><h3>Active Connections</h3>\n");
189         printf("<table border=1>\n");
190         printf("<tr><th>PID</th><th>Client</th><th>IP address</th><th>Date</th><th>Kill</th></tr>\n");
191
192         while (!feof(f)) {
193                 if (fread(&crec,sizeof(crec),1,f) != 1)
194                         break;
195                 if (crec.magic == 0x280267 && 
196                     crec.cnum == -1 &&
197                     process_exists(crec.pid)) {
198                         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",
199                                crec.pid,
200                                crec.machine,crec.addr,
201                                tstring(crec.start),
202                                crec.pid);
203                 }
204         }
205
206         printf("</table><p>\n");
207
208         fseek(f, 0, SEEK_SET);
209         
210         printf("<p><h3>Active Shares</h3>\n");
211         printf("<table border=1>\n");
212         printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n");
213
214         while (!feof(f)) {
215                 if (fread(&crec,sizeof(crec),1,f) != 1)
216                         break;
217                 if (crec.cnum == -1) continue;
218                 if (crec.magic == 0x280267 && process_exists(crec.pid)) {
219                         printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>\n",
220                                crec.name,uidtoname(crec.uid),
221                                gidtoname(crec.gid),crec.pid,
222                                crec.machine,
223                                tstring(crec.start));
224                 }
225         }
226
227         printf("</table><p>\n");
228
229         printf("<h3>Open Files</h3>\n");
230         printf("<table border=1>\n");
231         printf("<tr><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>File</th><th>Date</th></tr>\n");
232
233         locking_init(1);
234         share_mode_forall(print_share_mode);
235         locking_end();
236         printf("</table>\n");
237
238         fclose(f);
239
240         printf("</FORM>\n");
241 }
242