|
|
| version 1.27, 2025/04/02 15:36:25 | version 1.30, 2025/04/03 20:48:14 |
|---|---|
| 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.30 2025/04/03 20:48:14 snw | |
| * Improve daemon error diagnostics and bump to 0.63.0-rc3 | |
| * | |
| * Revision 1.29 2025/04/03 01:41:02 snw | |
| * New features frozen; prepare 0.63.0-rc1 | |
| * | |
| * Revision 1.28 2025/04/02 19:59:38 snw | |
| * Automatically modify env.conf from fmadm reconfigure | |
| * | |
| * Revision 1.27 2025/04/02 15:36:25 snw | * Revision 1.27 2025/04/02 15:36:25 snw |
| * Do extensive result checking for environment stop/start/restart in fmadm | * Do extensive result checking for environment stop/start/restart in fmadm |
| * | * |
| Line 171 extern char config_file[4096]; | Line 180 extern char config_file[4096]; |
| extern char env_config_file[4096]; | extern char env_config_file[4096]; |
| extern char env_user[255]; | extern char env_user[255]; |
| extern char env_group[255]; | extern char env_group[255]; |
| extern char env_enabled[10]; | |
| int fm_shell(void); | int fm_shell(void); |
| void fm_checkperms(void); | void fm_checkperms(void); |
| Line 201 int main (int argc, char **argv) | Line 211 int main (int argc, char **argv) |
| short got_action = FALSE; | short got_action = FALSE; |
| short got_object = FALSE; | short got_object = FALSE; |
| strcpy (env_enabled, "true"); | |
| /* snprintf (config_file, 4096, "%s/freem.conf", SYSCONFDIR); */ | /* snprintf (config_file, 4096, "%s/freem.conf", SYSCONFDIR); */ |
| Line 287 int main (int argc, char **argv) | Line 298 int main (int argc, char **argv) |
| base_arg++; | base_arg++; |
| break; | break; |
| case 'E': | |
| 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_enabled[k++] = argv[i][j]; | |
| } | |
| env_enabled[k] = '\0'; | |
| if ((strcmp (env_enabled, "true") != 0) && (strcmp (env_enabled, "false") != 0)) { | |
| fprintf (stderr, "fmadm: -E (environment enabled) option must be either 'true' or 'false'\n"); | |
| fmadm_usage (); | |
| exit (1); | |
| } | |
| base_arg++; | |
| break; | |
| case 'n': | case 'n': |
| if (argv[i][2] != '=') { | if (argv[i][2] != '=') { |
| Line 882 void fmadm_exit (int retval) | Line 918 void fmadm_exit (int retval) |
| int fmadm_usage (void) | int fmadm_usage (void) |
| { | { |
| fprintf (stdout, "\nusage: fmadm <action> <object> [-e=<environment] [-n=<namespace>] [OPTIONS]\n"); | fprintf (stdout, "\nusage: fmadm <action> <object> [-e=<environment] [-n=<namespace>] [-u=<user>] [-g=<group>] [-E=true|false] [OPTIONS]\n"); |
| fprintf (stdout, " fmadm configure\n"); | fprintf (stdout, " fmadm configure\n"); |
| fprintf (stdout, " fmadm reconfigure\n"); | fprintf (stdout, " fmadm reconfigure\n"); |
| /* fprintf (stdout, " fmadm checkperms\n\n"); */ | |
| 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, start,\n"); | fprintf (stdout, " import, export, backup, restore, migrate, edit, start,\n"); |
| fprintf (stdout, " stop, restart\n\n"); | fprintf (stdout, " stop, restart, status\n\n"); |
| fprintf (stdout, " <object> can be one of:\n"); | fprintf (stdout, " <object> can be one of:\n"); |
| fprintf (stdout, " lock, journal, namespace, global, routine, job,\n"); | fprintf (stdout, " lock, journal, namespace, global, routine, job,\n"); |
| Line 1273 int fm_daemonctl (short action, short ob | Line 1308 int fm_daemonctl (short action, short ob |
| char *savptr; | char *savptr; |
| int result; | int result; |
| long epid; | long epid; |
| int retval; | |
| retval = 0; | |
| switch (action) { | switch (action) { |
| case ACT_START: | case ACT_START: |
| Line 1368 int fm_daemonctl (short action, short ob | Line 1405 int fm_daemonctl (short action, short ob |
| } | } |
| else { | else { |
| fprintf (stderr, "[FAIL]\n"); | fprintf (stderr, "[FAIL]\n"); |
| retval++; | |
| } | } |
| break; | break; |
| Line 1379 int fm_daemonctl (short action, short ob | Line 1417 int fm_daemonctl (short action, short ob |
| } | } |
| else { | else { |
| fprintf (stderr, "[FAIL]\n"); | fprintf (stderr, "[FAIL]\n"); |
| retval++; | |
| } | } |
| } | } |
| else { | else { |
| fprintf (stderr, "[FAIL]\n"); | fprintf (stderr, "[FAIL]\n"); |
| retval++; | |
| } | } |
| break; | break; |
| Line 1403 int fm_daemonctl (short action, short ob | Line 1443 int fm_daemonctl (short action, short ob |
| } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL); | } while ((cur_env = strtok_r (NULL, ",", &savptr)) != NULL); |
| free (envlist); | free (envlist); |
| exit (0); | exit (retval); |
| } /* fm_daemonctl() */ | } /* fm_daemonctl() */ |
| Line 1430 void fm_reconfigure(void) | Line 1470 void fm_reconfigure(void) |
| fprintf (stderr, "fmadm: reconfiguring FreeM with system defaults for %s...\n", FREEM_VERSION_CSTR); | fprintf (stderr, "fmadm: reconfiguring FreeM with system defaults for %s...\n", FREEM_VERSION_CSTR); |
| fprintf (stderr, "fmadm: backing up %s to %s...\t", config_file, config_backup); | fprintf (stderr, "fmadm: backing up %s to %s...\t", config_file, config_backup); |
| retval = rename (config_file, config_backup); | #if !defined(__OS2__) |
| retval = cp (config_backup, config_file); | |
| #else | |
| retval = DosCopy (config_file, config_backup); | |
| #endif | |
| if (retval == 0) { | if (retval == 0) { |
| fprintf (stderr, "[OK]\n"); | fprintf (stderr, "[OK]\n"); |
| Line 1447 void fm_reconfigure(void) | Line 1491 void fm_reconfigure(void) |
| } /* fm_reconfigure() */ | } /* fm_reconfigure() */ |
| void update_conf (char *file, char *section, char *key, char *new_value) | |
| { | |
| char old_value[255]; | |
| char tbuf[255]; | |
| snprintf (tbuf, 254, "%s.%s", section, key); | |
| read_profile_string (file, section, key, old_value); | |
| if (strcmp (old_value, new_value) != 0) { | |
| modify_profile_string (file, section, key, new_value); | |
| fprintf (stderr, "\t%-40s%-20s -> %s\n", tbuf, old_value, new_value); | |
| } | |
| else { | |
| fprintf (stderr, "\t%-40s%-20s\n", tbuf, "no change"); | |
| } | |
| } | |
| void fm_configure (void) | void fm_configure (void) |
| { | { |
| Line 1472 void fm_configure (void) | Line 1532 void fm_configure (void) |
| char buf[4096]; | char buf[4096]; |
| FILE *fp; | FILE *fp; |
| int reconfigure = FALSE; | |
| struct stat etcstat; | struct stat etcstat; |
| int stat_result; | int stat_result; |
| Line 1482 void fm_configure (void) | Line 1544 void fm_configure (void) |
| char *username = env_user; | char *username = env_user; |
| char *groupname = env_group; | char *groupname = env_group; |
| #if !defined(__OS2__) | #if !defined(__OS2__) |
| if (geteuid () != 0) { | if (geteuid () != 0) { |
| fprintf (stderr, "fmadm: not superuser\n"); | fprintf (stderr, "fmadm: not superuser\n"); |
| Line 1525 void fm_configure (void) | Line 1587 void fm_configure (void) |
| } | } |
| if (file_exists (config_file)) { | if (file_exists (config_file)) { |
| fprintf (stderr, "fmadm: '%s' already exists; running fmadm reconfigure instead\n", config_file); | reconfigure = TRUE; |
| fm_reconfigure (); | |
| return; | |
| } | } |
| gethostname (hostid, 4095); | gethostname (hostid, 4095); |
| uuid_v4 (buf); | uuid_v4 (buf); |
| Line 1557 void fm_configure (void) | Line 1617 void fm_configure (void) |
| chmod (dstfile, 0755); | chmod (dstfile, 0755); |
| } | } |
| #else | |
| fprintf (stderr, "fmadm: not running on OS/2\n"); | |
| #endif | #endif |
| printf ("\nFreeM Initial Configuration\n"); | |
| printf ("---------------------------\n\n"); | |
| printf ("This utility will create the initial configuration file for "); | if (reconfigure == FALSE) { |
| printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file); | printf ("\nFreeM Initial Environment Configuration\n"); |
| printf ("---------------------------------------\n\n"); | |
| printf ("This utility will create the initial configuration files for "); | |
| printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file); | |
| } | |
| else { | |
| printf ("\nFreeM Environment Upgrade/Reconfiguration\n"); | |
| printf ("-----------------------------------------\n\n"); | |
| printf ("This utility will update the configuration files for "); | |
| printf ("FreeM environment '%s' (owned by %s:%s) in '%s'.\n\n", fma_environment, username, groupname, config_file); | |
| } | |
| /* check for existence of needed directories */ | /* check for existence of needed directories */ |
| if (stat (SYSCONFDIR, &etcstat) == -1) { | if (stat (SYSCONFDIR, &etcstat) == -1) { |
| Line 1613 void fm_configure (void) | Line 1680 void fm_configure (void) |
| snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); | snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); |
| snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); | snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
| fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); | if (reconfigure == FALSE) { |
| fprintf (stderr, "fmadm: populating new environment '%s'\n", fma_environment); | |
| } | |
| else { | |
| fprintf (stderr, "fmadm: upgrading environment '%s'\n", fma_environment); | |
| } | |
| snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); | snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); |
| mkdir (buf, 0775); | mkdir (buf, 0775); |
| Line 1679 void fm_configure (void) | Line 1751 void fm_configure (void) |
| } | } |
| fp = fopen (env_config_file, "a+"); | if (fm_validate_environment (fma_environment) == FALSE) { |
| fp = fopen (env_config_file, "a+"); | |
| fprintf (stderr, "Creating %s... ", env_config_file); | |
| fprintf (stderr, "Creating %s... ", env_config_file); | |
| snprintf (buf, 4095, "[%s]", fma_environment); | |
| fm_write (fp, buf); | 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, "enabled=%s", env_enabled); | |
| 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"); | |
| } | |
| else { | |
| char modtmp[255]; | |
| fprintf (stderr, "\nUpdating %s: \n", env_config_file); | |
| snprintf (buf, 4095, "user=%s", env_user); | update_conf (env_config_file, fma_environment, "user", env_user); |
| fm_write (fp, buf); | update_conf (env_config_file, fma_environment, "group", env_group); |
| update_conf (env_config_file, fma_environment, "enabled", env_enabled); | |
| snprintf (buf, 4095, "group=%s", env_group); | } |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "enabled=true"); | if (reconfigure == FALSE) { |
| fm_write (fp, buf); | fp = fopen (config_file, "a+"); |
| snprintf (buf, 4095, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); | fprintf (stderr, "Creating %s... ", config_file); |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "[SYSTEM]"); | |
| fclose (fp); | fm_write (fp, buf); |
| fprintf (stderr, "[OK]\n"); | |
| snprintf (buf, 4095, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); | |
| fp = fopen (config_file, "a+"); | fm_write (fp, buf); |
| fprintf (stderr, "Creating %s... ", config_file); | snprintf (buf, 4095, "routines_path=%s", sysrtn); |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "globals_path=%s", sysgbl); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_file=%s", jnlfile); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_mode=%s", jnlmode); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_host_id=%s", jnlhostid); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_cut_threshold=%s", jnlcut); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "zdate_format=%%x"); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "ztime_format=%%X"); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "\n[USER]"); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "routines_path=%s", usrrtn); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "globals_path=%s", usrgbl); | |
| fm_write (fp, buf); | |
| fclose (fp); | |
| set_permissions (config_file, username, groupname, 0755); | |
| fprintf (stderr, "[OK]\n"); | |
| snprintf (buf, 4095, "[SYSTEM]"); | printf ("FreeM initial configuration is complete.\n\n"); |
| fm_write (fp, buf); | } |
| else { | |
| snprintf (buf, 4095, "root=%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); | char tmpsd[255]; |
| fm_write (fp, buf); | read_profile_string (config_file, "SYSTEM", "journal_host_id", tmpsd); |
| snprintf (buf, 4095, "routines_path=%s", sysrtn); | /* existing configuration */ |
| fm_write (fp, buf); | fprintf (stderr, "\nUpdating environment configuration for %s:\n", fma_environment); |
| snprintf (buf, 4095, "globals_path=%s", sysgbl); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_file=%s", jnlfile); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_mode=%s", jnlmode); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "journal_host_id=%s", jnlhostid); | snprintf (buf, 4095, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); |
| fm_write (fp, buf); | update_conf (config_file, "SYSTEM", "root", buf); |
| update_conf (config_file, "SYSTEM", "routines_path", sysrtn); | |
| update_conf (config_file, "SYSTEM", "globals_path", sysgbl); | |
| update_conf (config_file, "SYSTEM", "journal_file", jnlfile); | |
| update_conf (config_file, "SYSTEM", "journal_mode", jnlmode); | |
| update_conf (config_file, "SYSTEM", "journal_host_id", tmpsd); | |
| update_conf (config_file, "SYSTEM", "journal_cut_threshold", jnlcut); | |
| snprintf (buf, 4095, "journal_cut_threshold=%s", jnlcut); | snprintf (buf, 4095, "%%x"); |
| fm_write (fp, buf); | update_conf (config_file, "SYSTEM", "zdate_format", buf); |
| snprintf (buf, 4095, "%%X"); | |
| update_conf (config_file, "SYSTEM", "ztime_format", buf); | |
| snprintf (buf, 4095, "zdate_format=%%x"); | /* USER */ |
| fm_write (fp, buf); | snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); |
| update_conf (config_file, "USER", "root", buf); | |
| update_conf (config_file, "USER", "routines_path", usrrtn); | |
| update_conf (config_file, "USER", "globals_path", usrgbl); | |
| snprintf (buf, 4095, "ztime_format=%%X"); | } |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "\n[USER]"); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "routines_path=%s", usrrtn); | |
| fm_write (fp, buf); | |
| snprintf (buf, 4095, "globals_path=%s", usrgbl); | |
| fm_write (fp, buf); | |
| fclose (fp); | printf ("\n\nUSER globals: %s\n", usrgbl); |
| set_permissions (config_file, username, groupname, 0755); | printf ("USER routines: %s\n", usrrtn); |
| fprintf (stderr, "[OK]\n"); | printf ("SYSTEM globals: %s\n", sysgbl); |
| printf ("SYSTEM routines: %s\n", sysrtn); | |
| printf ("FreeM initial configuration is complete.\n\n"); | printf ("After-image journal: %s [%s]\n", jnlfile, jnlmode); |
| printf ("Journal cut threshold: %s bytes\n", jnlcut); | |
| printf (" USER globals: %s\n", usrgbl); | printf ("Distributed journaling host ID: %s\n", jnlhostid); |
| printf (" USER routines: %s\n", usrrtn); | |
| printf (" SYSTEM globals: %s\n", sysgbl); | |
| printf (" SYSTEM routines: %s\n", sysrtn); | |
| printf (" After-image journal: %s [%s]\n", jnlfile, jnlmode); | |
| printf (" Journal cut threshold: %s bytes\n", jnlcut); | |
| printf (" Distributed journaling host ID: %s\n", jnlhostid); | |
| if (reconfigure == TRUE) { | |
| fprintf (stderr, "\nIf you previously defined environments other than '%s', you should run\n'fmadm reconfigure -e=<environment-name>' on each of them to ensure they have\nthe latest vendor routines and correct, updated settings.\n\n", fma_environment); | |
| } | |
| } /* fm_configure */ | } /* fm_configure */ |