--- freem/src/fmadm.c 2025/04/01 14:32:11 1.19 +++ freem/src/fmadm.c 2025/04/01 16:37:12 1.20 @@ -1,5 +1,5 @@ /* - * $Id: fmadm.c,v 1.19 2025/04/01 14:32:11 snw Exp $ + * $Id: fmadm.c,v 1.20 2025/04/01 16:37:12 snw Exp $ * FreeM Administration Tool * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: fmadm.c,v $ + * 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. + * * Revision 1.19 2025/04/01 14:32:11 snw * Begin work on environment and namespace reorg * @@ -144,6 +147,9 @@ short fma_explicit_environment = FALSE; char obj_str[STRLEN]; extern char config_file[4096]; +extern char env_config_file[4096]; +extern char env_user[255]; +extern char env_group[255]; int fm_shell(void); void fm_checkperms(void); @@ -151,6 +157,8 @@ void fm_reconfigure(void); void fm_configure(void); void fm_write (FILE *file, char *buf); int fma_jobs_remove (int optc, char **opts); +void set_permissions(char *path, char *user, char *grp, int mode); + int main (int argc, char **argv) { @@ -198,6 +206,43 @@ int main (int argc, char **argv) if (argv[i][0] == '-') { switch (argv[i][1]) { + + case 'u': + if (argv[i][2] != '=') { + fprintf (stderr, "fmadm: missing equals sign in flag -%c\n", argv[i][1]); + fmadm_usage (); + exit (1); + } + + k = 0; + + for (j = 3; j < strlen (argv[i]); j++) { + env_user[k++] = argv[i][j]; + } + + fma_explicit_environment = TRUE; + base_arg++; + + break; + + case 'g': + if (argv[i][2] != '=') { + fprintf (stderr, "fmadm: missing equals sign in flag -%c\n", argv[i][1]); + fmadm_usage (); + exit (1); + } + + k = 0; + + for (j = 3; j < strlen (argv[i]); j++) { + env_group[k++] = argv[i][j]; + } + + fma_explicit_environment = TRUE; + base_arg++; + + break; + case 'e': if (argv[i][2] != '=') { @@ -238,12 +283,24 @@ 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) { + fprintf (stderr, "fmadm: assuming group 'freem' for this environment's owner\n"); + snprintf (env_group, 6, "freem"); + } + if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT"); if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM"); snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); - + 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]); exit(1); @@ -1147,11 +1204,28 @@ void fm_configure (void) char src_dir[4096]; char dest_dir[4096]; + char *username = env_user; + char *groupname = env_group; + +#if !defined(__OS2__) struct group *d_grp; struct passwd *d_user; gid_t d_gid; - uid_t d_uid; + uid_t d_uid; + + if ((d_grp = getgrnam (groupname)) == NULL) { + fprintf (stderr, "fmadm: '%s' group must exist before configuring\n", groupname); + exit (1); + } + d_gid = d_grp->gr_gid; + if ((d_user = getpwnam (username)) == NULL) { + fprintf (stderr, "fmadm: '%s' user must exist before configuring\n", username); + exit (1); + } + d_uid = d_user->pw_uid; +#endif + snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR); snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); @@ -1169,20 +1243,6 @@ void fm_configure (void) fprintf (stderr, "fmadm: not superuser\n"); exit (1); } - -#if !defined(__OS2__) - if ((d_grp = getgrnam ("freem")) == NULL) { - fprintf (stderr, "fmadm: 'freem' group must exist before configuring\n"); - exit (1); - } - d_gid = d_grp->gr_gid; - - if ((d_user = getpwnam ("freem")) == NULL) { - fprintf (stderr, "fmadm: 'freem' user must exist before configuring\n"); - exit (1); - } - d_uid = d_user->pw_uid; -#endif if (file_exists (config_file)) { fprintf (stderr, "fmadm: '%s' already exists; running fmadm reconfigure instead\n", config_file); @@ -1190,12 +1250,10 @@ void fm_configure (void) return; } - gethostname (hostid, 4095); uuid_v4 (buf); snprintf (jnlhostid, 4095, "%s:%s", hostid, buf); - snprintf (confbase, 4095, "%s/freem", SYSCONFDIR); snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment); snprintf (nsbase, 4095, "%s/freem/%s", LOCALSTATEDIR, fma_environment); @@ -1227,65 +1285,37 @@ void fm_configure (void) printf ("---------------------------\n\n"); printf ("This utility will create the initial configuration file for "); - printf ("FreeM environment '%s' in %s.\n\n", fma_environment, config_file); + printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file); /* check for existence of needed directories */ if (stat (SYSCONFDIR, &etcstat) == -1) { fprintf (stderr, "fmadm: creating %s\n", SYSCONFDIR); mkdir (SYSCONFDIR, 0775); -#if !defined(__OS2__) - if (chown (SYSCONFDIR, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", SYSCONFDIR); - exit (1); - } -#endif + set_permissions (SYSCONFDIR, username, groupname, 0775); } if (stat (confbase, &etcstat) == -1) { fprintf (stderr, "fmadm: creating %s\n", confbase); mkdir (confbase, 0775); -#if !defined(__OS2__) - if (chown (confbase, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", confbase); - exit (1); - } -#endif + set_permissions (confbase, username, groupname, 0775); } if (stat (envbase, &etcstat) == -1) { fprintf (stderr, "fmadm: creating %s\n", envbase); mkdir (envbase, 0775); -#if !defined(__OS2__) - if (chown (envbase, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", envbase); - exit (1); - } -#endif - + set_permissions (envbase, username, groupname, 0775); } if (stat (varbase, &etcstat) == -1) { fprintf (stderr, "fmadm: creating %s\n", varbase); mkdir (varbase, 0775); -#if !defined(__OS2__) - if (chown (varbase, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", varbase); - exit (1); - } -#endif - + set_permissions (varbase, username, groupname, 0775); } if (stat (nsbase, &etcstat) == -1) { fprintf (stderr, "fmadm: creating %s\n", nsbase); mkdir (nsbase, 0775); -#if !defined(__OS2__) - if (chown (nsbase, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", nsbase); - exit (1); - } -#endif - + set_permissions (nsbase, username, groupname, 0775); } snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); @@ -1295,58 +1325,27 @@ void fm_configure (void) snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif - + set_permissions (buf, username, groupname, 0775); snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif + set_permissions (buf, username, groupname, 0775); snprintf (buf, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif + set_permissions (buf, username, groupname, 0775); snprintf (buf, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif + set_permissions (buf, username, groupname, 0775); snprintf (buf, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif + set_permissions (buf, username, groupname, 0775); snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); mkdir (buf, 0775); -#if !defined(__OS2__) - if (chown (buf, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", buf); - exit (1); - } -#endif + set_permissions (buf, username, groupname, 0775); fprintf (stderr, "fmadm: copying routines from '%s' to '%s'...\n", src_dir, dest_dir); @@ -1370,10 +1369,7 @@ void fm_configure (void) if (cp (outfile, infile) != 0) { fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); } - if (chown (outfile, d_uid, d_gid) != 0) { - fprintf (stderr, "fmadm: error setting ownership on %s\n", outfile); - exit (1); - } + set_permissions (outfile, username, groupname, 0755); #else if (DosCopy (infile, outfile, 1) != 0) { fprintf (stderr, "fmadm: failure copying %s to %s\n", infile, outfile); @@ -1383,10 +1379,29 @@ void fm_configure (void) } } + + fp = fopen (env_config_file, "a+"); + + fprintf (stderr, "Creating %s... ", env_config_file); + + snprintf (buf, 4095, "[%s]", fma_environment); + fm_write (fp, buf); + + snprintf (buf, 4095, "user=%s", env_user); + fm_write (fp, buf); + + snprintf (buf, 4095, "group=%s", env_group); + fm_write (fp, buf); + + snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); + fm_write (fp, buf); + + fclose (fp); + fprintf (stderr, "[OK]\n"); fp = fopen (config_file, "a+"); - printf ("Creating %s... ", config_file); + fprintf (stderr, "Creating %s... ", config_file); snprintf (buf, 4095, "[SYSTEM]"); fm_write (fp, buf); @@ -1429,40 +1444,11 @@ void fm_configure (void) snprintf (buf, 4095, "globals_path=%s", usrgbl); fm_write (fp, buf); - - + fclose (fp); + set_permissions (config_file, username, groupname, 0755); + fprintf (stderr, "[OK]\n"); -#if !defined(__OS2__) - if (chown (config_file, d_uid, d_gid) != 0) { - printf ("[FAIL]\n\n"); - fprintf (stderr, "fmadm: error setting ownership on %s\n", config_file); - exit (1); - } -#endif - - printf ("[OK]\n\n"); - -/* - printf ("Setting USER namespace permissions... "); - - snprintf (buf, 4095, "%s/freem/USER/globals", LOCALSTATEDIR); - chmod (buf, 0777); - - snprintf (buf, 4095, "%s/freem/USER/routines", LOCALSTATEDIR); - chmod (buf, 0777); - - printf ("[OK]\n"); - printf ("Setting SYSTEM namespace permissions... "); - - snprintf (buf, 4095, "%s/freem/SYSTEM/globals", LOCALSTATEDIR); - chmod (buf, 0755); - - snprintf (buf, 4095, "%s/freem/SYSTEM/routines", LOCALSTATEDIR); - chmod (buf, 0755); - - printf ("[OK]\n\n\n"); -*/ printf ("FreeM initial configuration is complete.\n\n"); printf (" USER globals: %s\n", usrgbl); @@ -1476,6 +1462,43 @@ void fm_configure (void) } /* fm_configure */ +void set_permissions(char *path, char *user, char *grp, int mode) +{ + +#if !defined(__OS2__) + struct group *d_grp; + struct passwd *d_user; + gid_t d_gid; + uid_t d_uid; +#endif + + +#if !defined(__OS2__) + if ((d_grp = getgrnam (grp)) == NULL) { + fprintf (stderr, "fmadm: '%s' group must exist before configuring\n", grp); + exit (1); + } + d_gid = d_grp->gr_gid; + + if ((d_user = getpwnam (user)) == NULL) { + fprintf (stderr, "fmadm: '%s' user must exist before configuring\n", user); + exit (1); + } + d_uid = d_user->pw_uid; + + if (chown (path, d_uid, d_gid) != 0) { + fprintf (stderr, "fmadm: error setting ownership on %s\n", path); + exit (1); + } +#endif + + if (chmod (path, mode) != 0) { + fprintf (stderr, "fmadm: error setting permissions on %s to %d\n", path, mode); + exit (1); + } + +} + void fm_write (FILE *file, char *buf) { fprintf (file, "%s\n", buf);