Diff for /freem/src/fmadm.c between versions 1.20 and 1.21

version 1.20, 2025/04/01 16:37:12 version 1.21, 2025/04/01 20:11:46
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.21  2025/04/01 20:11:46  snw
    *   Further work on fmadm
    *
  *   Revision 1.20  2025/04/01 16:37:12  snw   *   Revision 1.20  2025/04/01 16:37:12  snw
  *   Configure DEFAULT environment the same as others, and set permissions/ownership directly in fmadm configure. Add env.conf file as a centralized configuration listing all environments.   *   Configure DEFAULT environment the same as others, and set permissions/ownership directly in fmadm configure. Add env.conf file as a centralized configuration listing all environments.
  *   *
Line 155  int fm_shell(void); Line 158  int fm_shell(void);
 void fm_checkperms(void);  void fm_checkperms(void);
 void fm_reconfigure(void);  void fm_reconfigure(void);
 void fm_configure(void);  void fm_configure(void);
   int fm_daemonctl (short action, short object, int optc, char **options);
 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);
   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 256  int main (int argc, char **argv) Line 260  int main (int argc, char **argv)
                     for (j = 3; j < strlen (argv[i]); j++) {                      for (j = 3; j < strlen (argv[i]); j++) {
                         fma_environment[k++] = argv[i][j];                          fma_environment[k++] = argv[i][j];
                     }                      }
   
                       if (strcmp (fma_environment, "all") == 0 ) {
                           fprintf (stderr, "fmadm:  'all' is an invalid environment name\n");
                           exit (1);
                       }
                                           
                     fma_explicit_environment = TRUE;                      fma_explicit_environment = TRUE;
                     base_arg++;                      base_arg++;
Line 283  int main (int argc, char **argv) Line 292  int main (int argc, char **argv)
             }              }
         }          }
     }      }
       
     if (strlen (env_user) == 0) {  
         fprintf (stderr, "fmadm:  assuming user 'freem' for this environment's owner\n");  
         snprintf (env_user, 6, "freem");  
     }  
   
     if (strlen (env_group) == 0) {      if (obj != OBJ_DAEMON) {
         fprintf (stderr, "fmadm:  assuming group 'freem' for this environment's owner\n");          if (strlen (env_user) == 0) {
         snprintf (env_group, 6, "freem");              snprintf (env_user, 6, "freem");
     }          }
           
           if (strlen (env_group) == 0) {
               snprintf (env_group, 6, "freem");
           }
   
   
     if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT");          if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT");
     if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM");          if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM");
       
           snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment);
       }
           
     snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment);  
     snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR);      snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR);
           
     /*      /*
Line 306  int main (int argc, char **argv) Line 316  int main (int argc, char **argv)
     exit(1);      exit(1);
     */      */
           
     /* override for fmadm configure */      /* override for fmadm configure and daemon stuff */
     if (got_action) {      if (got_action) {
         if (strcmp (argv[1], "configure") == 0) {          if (strcmp (argv[1], "configure") == 0) {
             fm_configure ();              fm_configure ();
Line 316  int main (int argc, char **argv) Line 326  int main (int argc, char **argv)
             fm_reconfigure ();              fm_reconfigure ();
             exit (0);              exit (0);
         }          }
           else if (strcmp (argv[1], "start") == 0 && strcmp (argv[2], "environment") == 0) {
               act = ACT_START;
               obj = OBJ_DAEMON;
               goto act_switch;
           }
           else if (strcmp (argv[1], "stop") == 0 && strcmp (argv[2], "environment") == 0) {
               act = ACT_STOP;
               obj = OBJ_DAEMON;
               goto act_switch;
           }
           else if (strcmp (argv[1], "restart") == 0  && strcmp (argv[2], "environment") == 0) {
               act = ACT_RESTART;
               obj = OBJ_DAEMON;
               goto act_switch;
           }        
     }      }
   
     pid = getpid ();      pid = getpid ();
Line 326  int main (int argc, char **argv) Line 351  int main (int argc, char **argv)
     job_init (TRUE);      job_init (TRUE);
   
     fm_sig_init ();      fm_sig_init ();
       
     /* go to fmadm shell if no arguments passed */      /* go to fmadm shell if no arguments passed */
     if (!got_action && !got_object) return fm_shell ();          if (!got_action && !got_object) return fm_shell ();    
           
Line 334  int main (int argc, char **argv) Line 359  int main (int argc, char **argv)
         fm_checkperms ();          fm_checkperms ();
         exit (0);          exit (0);
     }      }
   
 #if 0  
     /* how many args do we have? */  
     switch (argc) {  
           
         case 3: /* action, object */  
             strncpy (action, argv[1], STRLEN - 1);  
             strncpy (obj_str, argv[2], STRLEN - 1);  
             strncpy (fma_namespace, "SYSTEM", STRLEN - 1);  
   
             optc = argc - 2;  
               
             fma_explicit_namespace = FALSE;  
             fma_min_args = 1;  
             base_arg = 3;  
               
             break;  
   
         case 4: /* action, object, namespace */  
   
             strncpy (action, argv[1], STRLEN - 1);  
             strncpy (obj_str, argv[2], STRLEN - 1);  
   
             if (validate_namespace (argv[3]) == TRUE) {  
                 strncpy (fma_namespace, argv[3], STRLEN - 1);  
                 fma_min_args = 2;  
                 fma_explicit_namespace = TRUE;  
                 base_arg = 4;  
                 optc = argc - 3;  
             }  
             else {  
                 strncpy (fma_namespace, "SYSTEM", 10);  
                 fma_min_args = 1;  
                 fma_explicit_namespace = FALSE;  
                 base_arg = 3;  
                 optc = argc - 2;  
             }  
   
             break;  
   
         default:  
             if (argc < 4) fmadm_usage();  
   
             /* we don't know what any but the first two args actually mean */  
             strncpy (action, argv[1], STRLEN - 1);  
             strncpy (obj_str, argv[2], STRLEN - 1);  
   
             if (validate_namespace (argv[3]) == TRUE) {  
                 strncpy (fma_namespace, argv[3], STRLEN - 1);  
                 fma_min_args = 2;  
                 fma_explicit_namespace = TRUE;  
                 base_arg = 4;  
                 optc = argc - 3;  
             }  
             else {  
                 strncpy (fma_namespace, "SYSTEM", 10);  
                 fma_min_args = 1;  
                 fma_explicit_namespace = FALSE;  
                 base_arg = 3;  
                 optc = argc - 2;  
             }  
   
   
     }  
 #endif  
           
     set_namespace (fma_namespace, FALSE);      set_namespace (fma_namespace, FALSE);
           
Line 440  int main (int argc, char **argv) Line 400  int main (int argc, char **argv)
     else if (strncmp (action, "backup", STRLEN - 1) == 0) act = ACT_BACKUP;      else if (strncmp (action, "backup", STRLEN - 1) == 0) act = ACT_BACKUP;
     else if (strncmp (action, "restore", STRLEN - 1) == 0) act = ACT_RESTORE;      else if (strncmp (action, "restore", STRLEN - 1) == 0) act = ACT_RESTORE;
     else if (strncmp (action, "migrate", STRLEN - 1) == 0) act = ACT_MIGRATE;      else if (strncmp (action, "migrate", STRLEN - 1) == 0) act = ACT_MIGRATE;
     else if (strncmp (action, "edit", STRLEN -1) == 0) act = ACT_EDIT;      else if (strncmp (action, "edit", STRLEN - 1) == 0) act = ACT_EDIT;
       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, "restart", STRLEN - 1) == 0) act = ACT_RESTART;
     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 450  int main (int argc, char **argv) Line 413  int main (int argc, char **argv)
     else if (strncmp (obj_str, "global", STRLEN - 1) == 0) obj = OBJ_GLOBAL;      else if (strncmp (obj_str, "global", STRLEN - 1) == 0) obj = OBJ_GLOBAL;
     else if (strncmp (obj_str, "routine", STRLEN - 1) == 0) obj = OBJ_ROUTINE;      else if (strncmp (obj_str, "routine", STRLEN - 1) == 0) obj = OBJ_ROUTINE;
     else if (strncmp (obj_str, "job", STRLEN - 1) == 0) obj = OBJ_JOB;      else if (strncmp (obj_str, "job", STRLEN - 1) == 0) obj = OBJ_JOB;
       else if (strncmp (obj_str, "environment", STRLEN - 1) == 0) obj = OBJ_DAEMON;
     else return fmadm_usage();      else return fmadm_usage();
   
       if (act > ACT_EDIT) goto act_switch;    
       
     if (get_conf (fma_namespace, "routines_path", fma_routine_path) == FALSE) {      if (get_conf (fma_namespace, "routines_path", fma_routine_path) == FALSE) {
         fprintf (stderr, "fmadm:  cannot determine routine path for namespace %s\n", fma_namespace);          fprintf (stderr, "fmadm:  cannot determine routine path for namespace %s\n", fma_namespace);
         return 1;          return 1;
Line 487  int main (int argc, char **argv) Line 453  int main (int argc, char **argv)
     stcnv_c2m (glopath);      stcnv_c2m (glopath);
   
   
   act_switch:
     switch (act) {      switch (act) {
   
                   
Line 541  int main (int argc, char **argv) Line 508  int main (int argc, char **argv)
         case ACT_EDIT:          case ACT_EDIT:
             fmadm_exit (fm_edit (obj, optc, opts));              fmadm_exit (fm_edit (obj, optc, opts));
   
           case ACT_START:
           case ACT_STOP:
           case ACT_RESTART:
               fmadm_exit (fm_daemonctl (act, obj, optc, opts));
   
         default:          default:
             return fmadm_usage();              return fmadm_usage();
Line 893  int fmadm_usage (void) Line 864  int fmadm_usage (void)
           
     fprintf (stdout, "        <action> can be one of:\n");      fprintf (stdout, "        <action> can be one of:\n");
     fprintf (stdout, "            list, examine, verify, compact, repair, create, remove,\n");      fprintf (stdout, "            list, examine, verify, compact, repair, create, remove,\n");
     fprintf (stdout, "            import, export, backup, restore, migrate, edit\n\n");      fprintf (stdout, "            import, export, backup, restore, migrate, edit, start,\n");
       fprintf (stdout, "            stop, restart\n\n");
   
     fprintf (stdout, "        <object> can be one of:\n");      fprintf (stdout, "        <object> can be one of:\n");
     fprintf (stdout, "            lock, zallocate, journal, namespace, global, routine, job\n\n");      fprintf (stdout, "            lock, zallocate, journal, namespace, global, routine, job,\n");
       fprintf (stdout, "            environment\n\n");
   
     fprintf (stdout, "    Not all actions are valid for all objects. Please see the FreeM manual\n");      fprintf (stdout, "    Not all actions are valid for all objects. Please see the FreeM manual\n");
     fprintf (stdout, "    for details on fmadm usage and options.\n\n");      fprintf (stdout, "    for details on fmadm usage and options.\n\n");
Line 1131  int fm_edit (short object, int optc, cha Line 1104  int fm_edit (short object, int optc, cha
   
 } /* fm_edit() */  } /* fm_edit() */
   
   int fm_daemonctl (short action, short object, int optc, char **options)
   {
       FILE *ef;
       char *envlist;
       char env[255];
       char line[255];
       char tmps[255];
       char *cur_env;
       char cmd[4096];
       char verb[20];
       char e_user[255];
       char e_grp[255];
       char e_ena[10];
       char basecmd[255];    
       char *savptr;
       int result;
   
   #if !defined(__OS2__)
       snprintf (basecmd, 254, "%s/bin/freem", PREFIX);
   #else
       snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX);
   #endif
       
       switch (action) {
           case ACT_START:
               sprintf (verb, "starting");
               break;
           case ACT_STOP:
               sprintf (verb, "stopping");
               break;
           case ACT_RESTART:
               sprintf (verb, "restarting");
               break;
       }
       
       if (optc) {
           /* environment list specified as command-line argument */
           envlist = options[0];
       }
       else {
           /* no environment specified; do 'action' for all environments */
           envlist = (char *) malloc (sizeof (char) * BIGSTR);
           NULLPTRCHK(envlist,"fm_daemonctl");
   
           ef = fopen (env_config_file, "r");
   
           while (fgets (line, 254, ef)) {
               if (line[0] == '[') {
                   strncpy (env, &(line[1]), 255);
                   env[strlen (env) - 2] = '\0';
                   snprintf (tmps, 255, "%s,", env);
                   strncat (envlist, tmps, BIGSTR - 1);
               }
           }
           envlist[strlen (envlist) - 1] = '\0';
   
           fclose (ef);        
       }
   
       savptr = envlist;
       cur_env = strtok_r (envlist, ",", &savptr);
       do {
           result = read_profile_string (env_config_file, cur_env, "enabled", e_ena);        
           if (result == FALSE || strcmp (e_ena, "true") == 0) {
   
               result = read_profile_string (env_config_file, cur_env, "user", e_user);
               if (result == FALSE) {
                   strcpy (e_user, "freem");
               }
               result = read_profile_string (env_config_file, cur_env, "group", e_grp);
               if (result == FALSE) {
                   strcpy (e_grp, "freem");
               }
               
               printf ("fmadm:  %s environment %s\n", verb, cur_env);
   
               switch (action) {
                   case ACT_START:
   #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                    
                       break;
                   case ACT_STOP:
                   case ACT_RESTART:
                       printf ("fmadm:  stop and restart not yet implemented\n");
                       break;
               }
   
               system (cmd);
           }
           else {
               printf ("fmadm:  %s environment is disabled; skipping\n", cur_env);
           }
       } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL);
   
       free (envlist);
       exit (0);
       
   } /* fm_daemonctl() */
   
 void fm_checkperms(void)  void fm_checkperms(void)
 {  {
   
Line 1174  void fm_reconfigure(void) Line 1249  void fm_reconfigure(void)
   
 void fm_configure (void)  void fm_configure (void)
 {  {
       char rundir[4096];
     char varbase[4096];      char varbase[4096];
     char sysrtn[4096];      char sysrtn[4096];
     char sysgbl[4096];      char sysgbl[4096];
Line 1228  void fm_configure (void) Line 1304  void fm_configure (void)
           
           
     snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR);      snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR);
       snprintf (rundir, 4095, "%s/freem/run", LOCALSTATEDIR);
     snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);      snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment);
     snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);      snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment);
     snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);      snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment);
Line 1311  void fm_configure (void) Line 1388  void fm_configure (void)
         mkdir (varbase, 0775);          mkdir (varbase, 0775);
         set_permissions (varbase, username, groupname, 0775);          set_permissions (varbase, username, groupname, 0775);
     }      }
       
       if (stat (rundir, &etcstat) == -1) {
           fprintf (stderr, "fmadm:  creating %s\n", rundir);
           mkdir (rundir, 0777);
           chmod (rundir, 0777);
       }
   
     if (stat (nsbase, &etcstat) == -1) {      if (stat (nsbase, &etcstat) == -1) {
         fprintf (stderr, "fmadm:  creating %s\n", nsbase);          fprintf (stderr, "fmadm:  creating %s\n", nsbase);
         mkdir (nsbase, 0775);          mkdir (nsbase, 0775);
Line 1392  void fm_configure (void) Line 1475  void fm_configure (void)
           
     snprintf (buf, 4095, "group=%s", env_group);      snprintf (buf, 4095, "group=%s", env_group);
     fm_write (fp, buf);      fm_write (fp, buf);
   
       snprintf (buf, 4095, "enabled=true");
       fm_write (fp, buf);
           
     snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment);      snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment);
     fm_write (fp, buf);      fm_write (fp, buf);

Removed from v.1.20  
changed lines
  Added in v.1.21


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