Diff for /freem/src/fmadm.c between versions 1.25 and 1.27

version 1.25, 2025/04/02 04:50:49 version 1.27, 2025/04/02 15:36:25
Line 24 Line 24
  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.   *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
  *   *
  *   $Log$   *   $Log$
    *   Revision 1.27  2025/04/02 15:36:25  snw
    *   Do extensive result checking for environment stop/start/restart in fmadm
    *
    *   Revision 1.26  2025/04/02 14:37:57  snw
    *   Improve environment control parts of fmadm
    *
  *   Revision 1.25  2025/04/02 04:50:49  snw   *   Revision 1.25  2025/04/02 04:50:49  snw
  *   Allow vendor routines to be upgraded   *   Allow vendor routines to be upgraded
  *   *
Line 174  int fm_daemonctl (short action, short ob Line 180  int fm_daemonctl (short action, short ob
 void fm_write (FILE *file, char *buf);  void fm_write (FILE *file, char *buf);
 int fma_jobs_remove (int optc, char **opts);  int fma_jobs_remove (int optc, char **opts);
 void set_permissions(char *path, char *user, char *grp, int mode);  void set_permissions(char *path, char *user, char *grp, int mode);
   int fm_environment_running (char *env);
 extern int read_profile_string(char *file, char *section, char *key, char *value);  extern int read_profile_string(char *file, char *section, char *key, char *value);
   
 int main (int argc, char **argv)  int main (int argc, char **argv)
Line 321  int main (int argc, char **argv) Line 328  int main (int argc, char **argv)
           
     snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR);      snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR);
           
     /*  /*
     printf ("action = '%s' object = '%s' environment = '%s' namespace = '%s' config_file = '%s' base_arg = '%d' next argument = '%s'\n", action, obj_str, fma_environment, fma_namespace, config_file, base_arg, argv[base_arg]);      printf ("action = '%s' object = '%s' environment = '%s' namespace = '%s' config_file = '%s' base_arg = '%d' next argument = '%s'\n", action, obj_str, fma_environment, fma_namespace, config_file, base_arg, argv[base_arg]);
     exit(1);      exit(1);
     */  */
           
     /* override for fmadm configure and daemon stuff */      /* override for fmadm configure and daemon stuff */
     if (got_action) {      if (got_action) {
Line 339  int main (int argc, char **argv) Line 346  int main (int argc, char **argv)
         else if (strcmp (argv[1], "start") == 0 && strcmp (argv[2], "environment") == 0) {          else if (strcmp (argv[1], "start") == 0 && strcmp (argv[2], "environment") == 0) {
             act = ACT_START;              act = ACT_START;
             obj = OBJ_DAEMON;              obj = OBJ_DAEMON;
             goto act_switch;              goto process_args;
         }          }
         else if (strcmp (argv[1], "stop") == 0 && strcmp (argv[2], "environment") == 0) {          else if (strcmp (argv[1], "stop") == 0 && strcmp (argv[2], "environment") == 0) {
             act = ACT_STOP;              act = ACT_STOP;
             obj = OBJ_DAEMON;              obj = OBJ_DAEMON;
             goto act_switch;              goto process_args;
         }          }
         else if (strcmp (argv[1], "restart") == 0  && strcmp (argv[2], "environment") == 0) {          else if (strcmp (argv[1], "restart") == 0  && strcmp (argv[2], "environment") == 0) {
             act = ACT_RESTART;              act = ACT_RESTART;
             obj = OBJ_DAEMON;              obj = OBJ_DAEMON;
             goto act_switch;              goto process_args;
         }          }
         else if (strcmp (argv[1], "status") == 0  && strcmp (argv[2], "environment") == 0) {          else if (strcmp (argv[1], "status") == 0  && strcmp (argv[2], "environment") == 0) {
             act = ACT_STATUS;              act = ACT_STATUS;
             obj = OBJ_DAEMON;              obj = OBJ_DAEMON;
             goto act_switch;              goto process_args;
         }                  }        
   
     }      }
Line 377  int main (int argc, char **argv) Line 384  int main (int argc, char **argv)
     }      }
           
     set_namespace (fma_namespace, FALSE);      set_namespace (fma_namespace, FALSE);
       
   process_args:    
     /* allocate opts array */      /* allocate opts array */
           
     /* first dimension */      /* first dimension */
Line 400  int main (int argc, char **argv) Line 408  int main (int argc, char **argv)
   
     j = 1;      j = 1;
     for (i = base_arg; i < argc; i++) {      for (i = base_arg; i < argc; i++) {
         if (i > FMA_MAXARGS) return fmadm_usage(); /* bail if we're going to overrun the array */          if (i > FMA_MAXARGS) return fmadm_usage();        
           /* bail if we're going to overrun the array */
         strncpy (opts[j++], argv[i], STRLEN - 1);          strncpy (opts[j++], argv[i], STRLEN - 1);
     }      }
           
Line 420  int main (int argc, char **argv) Line 429  int main (int argc, char **argv)
     else if (strncmp (action, "start", STRLEN - 1) == 0) act = ACT_START;      else if (strncmp (action, "start", STRLEN - 1) == 0) act = ACT_START;
     else if (strncmp (action, "stop", STRLEN - 1) == 0) act = ACT_STOP;      else if (strncmp (action, "stop", STRLEN - 1) == 0) act = ACT_STOP;
     else if (strncmp (action, "restart", STRLEN - 1) == 0) act = ACT_RESTART;      else if (strncmp (action, "restart", STRLEN - 1) == 0) act = ACT_RESTART;
       else if (strncmp (action, "status", STRLEN - 1) == 0) act = ACT_STATUS;
     else return fmadm_usage();      else return fmadm_usage();
   
     if (strncmp (obj_str, "lock", STRLEN - 1) == 0) obj = OBJ_LOCK;      if (strncmp (obj_str, "lock", STRLEN - 1) == 0) obj = OBJ_LOCK;
Line 1144  long fm_get_pid (char *env) Line 1154  long fm_get_pid (char *env)
     }                  }            
 }  }
   
   int fm_validate_environment (char *env)
   {
       FILE *fp;
       char line[255];
       char chkline[255];
   
       snprintf (chkline, 254, "[%s]\n", env);
       
       if ((fp = fopen (env_config_file, "r")) == NULL) {
           fprintf (stderr, "fmadm:  could not open %s [%s]\n", env_config_file, strerror (errno));
           return FALSE;
       }
   
       while (fgets (line, 254, fp)) {
           if (strncmp (line, chkline, 254) == 0) {
               fclose (fp);
               return TRUE;
           }
       }
   
       fclose (fp);
       return FALSE;
   }
   
   int fm_start_environment (char *env, char *e_user, char *e_grp)
   {
       char basecmd[255];
       char cmd[4096];    
   
       if (fm_environment_running (env) == TRUE) {
           return TRUE;
       }
       
   #if !defined(__OS2__)
       snprintf (basecmd, 254, "%s/bin/freem", PREFIX);
   #else
       snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX);
   #endif
   
   #if !defined(__OS2__)                    
       snprintf (cmd, 4095, "%s -d -e %s -u %s -g %s", basecmd, env, e_user, e_grp);
   #else
       sprintf (cmd, 4095, "%s -d -k -e %s -u %s -g %s", basecmd, env, e_user, e_grp);
   #endif
   
       system (cmd);
   
       sleep (1);
       
       return (fm_environment_running (env));
   }
   
   int fm_stop_environment (char *env)
   {
       long epid;
   
       epid = fm_get_pid (env);
       if (epid > -1) {
           kill (epid, SIGINT);
           sleep (5);
   
           if (fm_environment_running (env) == FALSE) {
               return TRUE;
           }
           else {
               kill (epid, SIGTERM);
               sleep (5);
               if (fm_environment_running (env) == FALSE) {
                   return TRUE;
               }
               else {
                   kill (epid, SIGKILL);
                   sleep (5);
                   if (fm_environment_running (env) == FALSE) {
                       return TRUE;
                   }
                   else {
                       return FALSE;
                   }
               }
           }
       }
       else {
           return FALSE;
       }   
   }
   
   int fm_environment_running (char *env)
   {       
       long epid;
       int result;
       
       epid = fm_get_pid (env);
   
       if (epid == -1) {
           return FALSE;
       }
       else {
           result = kill (epid, 0);
   
           return ((result == 0) ? TRUE : FALSE);
       }
   }
   
 int fm_daemonctl (short action, short object, int optc, char **options)  int fm_daemonctl (short action, short object, int optc, char **options)
 {  {
     FILE *ef;      FILE *ef;
Line 1152  int fm_daemonctl (short action, short ob Line 1266  int fm_daemonctl (short action, short ob
     char line[255];      char line[255];
     char tmps[255];      char tmps[255];
     char *cur_env;      char *cur_env;
     char cmd[4096];  
     char verb[40];      char verb[40];
     char e_user[255];      char e_user[255];
     char e_grp[255];      char e_grp[255];
     char e_ena[10];      char e_ena[10];
     char basecmd[255];      
     char *savptr;      char *savptr;
     int result;      int result;
     long epid;      long epid;
      
 #if !defined(__OS2__)  
     snprintf (basecmd, 254, "%s/bin/freem", PREFIX);  
 #else  
     snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX);  
 #endif  
           
     switch (action) {      switch (action) {
         case ACT_START:          case ACT_START:
Line 1188  int fm_daemonctl (short action, short ob Line 1295  int fm_daemonctl (short action, short ob
         envlist = (char *) malloc (sizeof (char) * BIGSTR);          envlist = (char *) malloc (sizeof (char) * BIGSTR);
         NULLPTRCHK(envlist,"fm_daemonctl");          NULLPTRCHK(envlist,"fm_daemonctl");
   
         strcpy (envlist, options[0]);          strcpy (envlist, options[1]);
     }      }
     else {      else {
         /* no environment specified; do 'action' for all environments */          /* no environment specified; do 'action' for all environments */
Line 1213  int fm_daemonctl (short action, short ob Line 1320  int fm_daemonctl (short action, short ob
     savptr = envlist;      savptr = envlist;
     cur_env = strtok_r (envlist, ",", &savptr);      cur_env = strtok_r (envlist, ",", &savptr);
     do {      do {
           
           if (fm_validate_environment (cur_env) == FALSE) {
               fprintf (stderr, "fmadm:  %s is not a valid environment\n", cur_env);
               continue;
           }
   
         result = read_profile_string (env_config_file, cur_env, "enabled", e_ena);                  result = read_profile_string (env_config_file, cur_env, "enabled", e_ena);        
         if (result == FALSE || strcmp (e_ena, "true") == 0) {          if (result == FALSE || strcmp (e_ena, "true") == 0) {
   
Line 1225  int fm_daemonctl (short action, short ob Line 1338  int fm_daemonctl (short action, short ob
                 strcpy (e_grp, "freem");                  strcpy (e_grp, "freem");
             }              }
   
             printf ("fmadm:  %s environment %s\n", verb, cur_env);              switch (action) {
                   case ACT_START:
                   case ACT_STOP:
                   case ACT_RESTART:
                       fprintf (stderr, "fmadm:  %s environment %s... ", verb, cur_env);
                       break;
                   case ACT_STATUS:
                       fprintf (stderr, "fmadm:  %s environment %s\n", verb, cur_env);
                       break;
               }
   
             switch (action) {              switch (action) {
                   
                 case ACT_START:                  case ACT_START:
 #if !defined(__OS2__)                                          result = fm_start_environment (cur_env, e_user, e_grp);
                     snprintf (cmd, 4095, "%s -d -e %s -u %s -g %s", basecmd, cur_env, e_user, e_grp);                      if (result == TRUE) {
 #else                          fprintf (stderr, "[OK]\n");
                     sprintf (cmd, 4095, "%s -d -k -e %s -u %s -g %s", basecmd, cur_env, e_user, e_grp);                      }
 #endif                      else {
                     system (cmd);                          fprintf (stderr, "[FAIL]\n");
                       }
                     break;                      break;
   
                 case ACT_STOP:                  case ACT_STOP:
                     epid = fm_get_pid (cur_env);                      result = fm_stop_environment (cur_env);
                     if (epid > -1) {                      if (result == TRUE) {
                         fprintf (stderr, "fmadm:  stopping environment daemon pid %d\n", epid);                          fprintf (stderr, "[OK]\n");
                         kill (epid, SIGINT);  
                         kill (epid, SIGTERM);  
                     }                      }
                     else {                      else {
                         fprintf (stderr, "fmadm:  could not obtain environment daemon pid\n");                          fprintf (stderr, "[FAIL]\n");
                     }                      }                    
                       
                     break;                      break;
   
                 case ACT_RESTART:                  case ACT_RESTART:
                     epid = fm_get_pid (cur_env);                      if (fm_stop_environment (cur_env) == TRUE) {
                     if (epid > -1) {                          result = fm_start_environment (cur_env, e_user, e_grp);
                         fprintf (stderr, "fmadm:  stopping environment daemon pid %d\n", epid);                          if (result == TRUE) {
                         kill (epid, SIGINT);                              fprintf (stderr, "[OK]\n");
                         kill (epid, SIGTERM);                          }
                           else {
                               fprintf (stderr, "[FAIL]\n");
                           }                        
                     }                      }
                     else {                      else {
                         fprintf (stderr, "fmadm:  could not obtain environment daemon pid\n");                          fprintf (stderr, "[FAIL]\n");
                     }                      }                       
                     fprintf (stderr, "fmadm:  waiting 2 seconds\n");  
                     sleep (2);  
                     fprintf (stderr, "fmadm:  starting environment %s\n", cur_env);  
 #if !defined(__OS2__)                      
                     snprintf (cmd, 4095, "%s -d -e %s -u %s -g %s", basecmd, cur_env, e_user, e_grp);  
 #else  
                     sprintf (cmd, 4095, "%s -d -k -e %s -u %s -g %s", basecmd, cur_env, e_user, e_grp);  
 #endif  
                     system (cmd);  
                       
   
                     break;                      break;
                       
                 case ACT_STATUS:                  case ACT_STATUS:
                     epid = fm_get_pid (cur_env);                      epid = fm_get_pid (cur_env);
                     if (epid > -1) {                      if (epid > -1) {

Removed from v.1.25  
changed lines
  Added in v.1.27


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>