added the ability to start/stop the server from SWAT.
authorAndrew Tridgell <tridge@samba.org>
Sat, 14 Mar 1998 12:57:58 +0000 (12:57 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sat, 14 Mar 1998 12:57:58 +0000 (12:57 +0000)
I needed to modify the way the pidfile is handled in nmbd and smbd to
do this. Jeremy, you may wish to look at what I've done as it probably
breaks the Whistle use of pidfiles. In particular I've removed the -f
option and instead smbd and nmbd always create a pidfile in the lock
directory.
(This used to be commit 20bb22d61b986d2036c681fc33db60f2b2b3c1c7)

source3/include/proto.h
source3/lib/util.c
source3/nmbd/nmbd.c
source3/smbd/server.c
source3/web/swat.c

index 9c7c37f1a685c8f1d2126325d60286cc9a856ecd..88b340319e193db45cf0dd59b03b3aaa07d81258 100644 (file)
@@ -1487,6 +1487,11 @@ BOOL server_validate(char *user, char *domain,
 BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname);
 void pcap_printer_fn(void (*fn)());
 
+/*The following definitions come from  pidfile.c  */
+
+void pidfile_create(char *name);
+int pidfile_pid(char *name);
+
 /*The following definitions come from  pipes.c  */
 
 int reply_open_pipe_and_X(char *inbuf,char *outbuf,int length,int bufsize);
@@ -1913,6 +1918,18 @@ char *cgi_baseurl(void);
 char *cgi_rooturl(void);
 char *cgi_pathinfo(void);
 
+/*The following definitions come from  web/diagnose.c  */
+
+BOOL nmbd_running(void);
+BOOL smbd_running(void);
+
+/*The following definitions come from  web/startstop.c  */
+
+void start_smbd(void);
+void start_nmbd(void);
+void stop_smbd(void);
+void stop_nmbd(void);
+
 /*The following definitions come from  web/swat.c  */
 
 int main(int argc, char *argv[]);
index 19fa42592fdfd4378ee756cab3c687d99c8c1235..3bc96e1034bdfdbc2fce0ded18a51fd94d5f4ccd 100644 (file)
@@ -3106,7 +3106,7 @@ void become_daemon(void)
 {
 #ifndef NO_FORK_DEBUG
   if (fork())
-    exit(0);
+    _exit(0);
 
   /* detach from the terminal */
 #ifdef USE_SETSID
index f199a21ea8a63c02b81310d1d40fbfb9486ed1b5..e757aa46c414c6c3fabf06fd30213bd38dfdcbe0 100644 (file)
@@ -549,7 +549,6 @@ int main(int argc,char *argv[])
   int opt;
   extern FILE *dbf;
   extern char *optarg;
-  char pidFile[100] = { 0 };
 
   global_nmb_port = NMB_PORT;
   *host_file = 0;
@@ -599,9 +598,6 @@ int main(int argc,char *argv[])
     {
       switch (opt)
         {
-        case 'f':
-          strncpy(pidFile, optarg, sizeof(pidFile));
-          break;
         case 's':
           pstrcpy(servicesf,optarg);
           break;          
@@ -695,40 +691,11 @@ int main(int argc,char *argv[])
     become_daemon();
   }
 
-  if (!directory_exist(lp_lockdir(), NULL))
-  {
-    mkdir(lp_lockdir(), 0755);
-  }
-
-  if (*pidFile)
-  {
-    int     fd;
-    char    buf[20];
-
-#ifdef O_NONBLOCK
-    fd = open( pidFile, O_NONBLOCK | O_CREAT | O_WRONLY | O_TRUNC, 0644 );
-#else
-    fd = open( pidFile, O_CREAT | O_WRONLY | O_TRUNC, 0644 );
-#endif
-    if ( fd < 0 )
-    {
-      DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno)));
-      exit(1);
-    }
-    if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False)
-    {
-      DEBUG(0,("ERROR: nmbd is already running\n"));
-      exit(1);
-    }
-    sprintf(buf, "%u\n", (unsigned int) getpid());
-    if (write(fd, buf, strlen(buf)) < 0)
-    {
-      DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno)));
-      exit(1);
-    }
-      /* Leave pid file open & locked for the duration... */
+  if (!directory_exist(lp_lockdir(), NULL)) {
+         mkdir(lp_lockdir(), 0755);
   }
 
+  pidfile_create("nmbd");
 
   DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );
 
index b42ebd6c0fd00a44d1d2aa10a03201db39185ef6..ca4a95f59dbfad014d4c1089b5b9a35fc0e6063f 100644 (file)
@@ -5144,9 +5144,6 @@ static void usage(char *pname)
   int port = SMB_PORT;
   int opt;
   extern char *optarg;
-  char pidFile[100];
-
-  *pidFile = '\0';
 
 #ifdef NEED_AUTH_PARAMETERS
   set_auth_parameters(argc,argv);
@@ -5200,9 +5197,6 @@ static void usage(char *pname)
   while ((opt = getopt(argc, argv, "O:i:l:s:d:Dp:hPaf:")) != EOF)
     switch (opt)
       {
-      case 'f':
-        strncpy(pidFile, optarg, sizeof(pidFile));
-        break;
       case 'O':
        strcpy(user_socket_options,optarg);
        break;
@@ -5328,33 +5322,9 @@ static void usage(char *pname)
          mkdir(lp_lockdir(), 0755);
   }
 
-  if (*pidFile)
-    {
-      int     fd;
-      char    buf[20];
-
-      if ((fd = open(pidFile,
-#ifdef O_NONBLOCK
-         O_NONBLOCK | 
-#endif
-         O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)
-        {
-           DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno)));
-           exit(1);
-        }
-      if(fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False)
-        {
-          DEBUG(0,("ERROR: smbd is already running\n"));
-          exit(1);
-        }
-      sprintf(buf, "%u\n", (unsigned int) getpid());
-      if (write(fd, buf, strlen(buf)) < 0)
-        {
-          DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno)));
-          exit(1);
-        }
-      /* Leave pid file open & locked for the duration... */
-    }
+  if (is_daemon) {
+         pidfile_create("smbd");
+  }
 
   if (!open_sockets(is_daemon,port))
     exit(1);
index 650740428f93a57fb3e7dc08a222d145829cd175..422259a05a292967bd5be45a1d91a9375aa2a005 100644 (file)
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/Netbios implementation.
    Version 1.9.
-   html smb.conf editing - prototype only
+   Samba Web Administration Tool
    Copyright (C) Andrew Tridgell 1997-1998
    
    This program is free software; you can redistribute it and/or modify
@@ -537,8 +537,26 @@ static void status_page(void)
        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,"","/");
@@ -553,9 +571,32 @@ static void status_page(void)
        }
 
 
-       printf("\nSamba version %s\n<p>",VERSION);
+       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);
+
 
-       printf("<h3>Active Connections</h3>\n");
+       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");
 
@@ -583,6 +624,8 @@ static void status_page(void)
        printf("</table>\n");
 
        fclose(f);
+
+       printf("</FORM>\n");
 }