version 1.27, 2025/04/02 15:36:25
|
version 1.38, 2025/04/15 02:24:43
|
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.38 2025/04/15 02:24:43 snw |
|
* Improve FreeM logging capabilities |
|
* |
|
* Revision 1.37 2025/04/14 19:20:20 snw |
|
* Create LOCALSTATEDIR during fmadm configure if needed |
|
* |
|
* Revision 1.36 2025/04/13 15:12:21 snw |
|
* Fix transaction checkpoints on OS/2 [CLOSES #34] |
|
* |
|
* Revision 1.35 2025/04/13 04:22:43 snw |
|
* Fix snprintf calls |
|
* |
|
* Revision 1.34 2025/04/10 15:31:25 snw |
|
* Attempt to fix DosCopy calls for OS/2 |
|
* |
|
* Revision 1.33 2025/04/10 01:24:38 snw |
|
* Remove C++ style comments |
|
* |
|
* Revision 1.32 2025/04/09 19:52:02 snw |
|
* Eliminate as many warnings as possible while building with -Wall |
|
* |
|
* Revision 1.31 2025/04/04 19:43:18 snw |
|
* Switch to using environment catalog to determine user and group for environment, and remove -u and -g flags from freem |
|
* |
|
* 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 104
|
Line 137
|
#include <unistd.h> |
#include <unistd.h> |
#include <errno.h> |
#include <errno.h> |
#include <ctype.h> |
#include <ctype.h> |
|
#if defined(__OS2__) |
|
# include <os2.h> |
|
#endif |
#include "config.h" |
#include "config.h" |
#include "transact.h" |
#include "transact.h" |
#include "namespace.h" |
#include "namespace.h" |
#include "fs.h" |
#include "fs.h" |
|
|
#if defined(__OS2__) |
|
# include <os2.h> |
|
#endif |
|
|
|
#ifdef HAVE_LIBREADLINE |
#ifdef HAVE_LIBREADLINE |
# if defined(HAVE_READLINE_READLINE_H) |
# if defined(HAVE_READLINE_READLINE_H) |
# include <readline/readline.h> |
# include <readline/readline.h> |
Line 171 extern char config_file[4096];
|
Line 203 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 234 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 321 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 312 int main (int argc, char **argv)
|
Line 371 int main (int argc, char **argv)
|
|
|
if (obj != OBJ_DAEMON) { |
if (obj != OBJ_DAEMON) { |
if (strlen (env_user) == 0) { |
if (strlen (env_user) == 0) { |
snprintf (env_user, 6, "freem"); |
snprintf (env_user, sizeof (env_user) - 1, "freem"); |
} |
} |
|
|
if (strlen (env_group) == 0) { |
if (strlen (env_group) == 0) { |
snprintf (env_group, 6, "freem"); |
snprintf (env_group, sizeof (env_group) - 1, "freem"); |
} |
} |
|
|
|
|
if (!fma_explicit_environment) snprintf (fma_environment, 4096, "DEFAULT"); |
if (!fma_explicit_environment) snprintf (fma_environment, sizeof (fma_environment) - 1, "DEFAULT"); |
if (!fma_explicit_namespace) snprintf (fma_namespace, 4096, "SYSTEM"); |
if (!fma_explicit_namespace) snprintf (fma_namespace, sizeof (fma_namespace) - 1, "SYSTEM"); |
|
|
snprintf (config_file, 4096, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); |
snprintf (config_file, sizeof (config_file) - 1, "%s/freem/%s/freem.conf", SYSCONFDIR, fma_environment); |
} |
} |
|
|
snprintf (env_config_file, 4096, "%s/freem/env.conf", SYSCONFDIR); |
snprintf (env_config_file, sizeof (env_config_file) - 1, "%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]); |
Line 564 int fm_shell (void)
|
Line 623 int fm_shell (void)
|
char *cmdt = (char *) malloc (65535 * sizeof (char)); |
char *cmdt = (char *) malloc (65535 * sizeof (char)); |
char *result = (char *) malloc (65535 * sizeof (char)); |
char *result = (char *) malloc (65535 * sizeof (char)); |
|
|
/* |
obj = 0; |
strcpy (fma_namespace, "SYSTEM"); |
|
set_namespace (fma_namespace, FALSE); |
|
*/ |
|
|
|
snprintf (fma_prompt, STRLEN - 1, "fmadm [%s]> ", fma_namespace); |
snprintf (fma_prompt, STRLEN - 1, "fmadm [%s]> ", fma_namespace); |
|
|
Line 672 int fm_shell (void)
|
Line 728 int fm_shell (void)
|
|
|
i = 0; |
i = 0; |
while ((result = strtok (NULL, " ")) != NULL) { |
while ((result = strtok (NULL, " ")) != NULL) { |
// printf ("%d = %s\n", i, result); |
|
strcpy (args[i++], result); |
strcpy (args[i++], result); |
} |
} |
|
|
Line 882 void fmadm_exit (int retval)
|
Line 937 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 1133 long fm_get_pid (char *env)
|
Line 1187 long fm_get_pid (char *env)
|
{ |
{ |
char pid_file[4096]; |
char pid_file[4096]; |
char tmp_pid[255]; |
char tmp_pid[255]; |
long res; |
|
|
|
FILE *fp; |
FILE *fp; |
|
|
snprintf (pid_file, 4095, "%s/freem/run/%s.pid", LOCALSTATEDIR, env); |
snprintf (pid_file, sizeof (pid_file) - 1, "%s/freem/run/%s.pid", LOCALSTATEDIR, env); |
|
|
if ((fp = fopen (pid_file, "r")) != NULL) { |
if ((fp = fopen (pid_file, "r")) != NULL) { |
if (fgets (tmp_pid, 255, fp)) { |
if (fgets (tmp_pid, 255, fp)) { |
Line 1160 int fm_validate_environment (char *env)
|
Line 1212 int fm_validate_environment (char *env)
|
char line[255]; |
char line[255]; |
char chkline[255]; |
char chkline[255]; |
|
|
snprintf (chkline, 254, "[%s]\n", env); |
snprintf (chkline, sizeof (chkline) - 1, "[%s]\n", env); |
|
|
if ((fp = fopen (env_config_file, "r")) == NULL) { |
if ((fp = fopen (env_config_file, "r")) == NULL) { |
fprintf (stderr, "fmadm: could not open %s [%s]\n", env_config_file, strerror (errno)); |
fprintf (stderr, "fmadm: could not open %s [%s]\n", env_config_file, strerror (errno)); |
Line 1178 int fm_validate_environment (char *env)
|
Line 1230 int fm_validate_environment (char *env)
|
return FALSE; |
return FALSE; |
} |
} |
|
|
int fm_start_environment (char *env, char *e_user, char *e_grp) |
int fm_start_environment (char *env) |
{ |
{ |
char basecmd[255]; |
char basecmd[255]; |
char cmd[4096]; |
char cmd[4096]; |
Line 1188 int fm_start_environment (char *env, cha
|
Line 1240 int fm_start_environment (char *env, cha
|
} |
} |
|
|
#if !defined(__OS2__) |
#if !defined(__OS2__) |
snprintf (basecmd, 254, "%s/bin/freem", PREFIX); |
snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freem", PREFIX); |
#else |
#else |
snprintf (basecmd, 254, "%s/bin/freemd.exe", PREFIX); |
snprintf (basecmd, sizeof (basecmd) - 1, "%s/bin/freemd.exe", PREFIX); |
#endif |
#endif |
|
|
#if !defined(__OS2__) |
#if !defined(__OS2__) |
snprintf (cmd, 4095, "%s -d -e %s -u %s -g %s", basecmd, env, e_user, e_grp); |
snprintf (cmd, sizeof (basecmd) - 1, "%s -d -e %s", basecmd, env); |
#else |
#else |
sprintf (cmd, 4095, "%s -d -k -e %s -u %s -g %s", basecmd, env, e_user, e_grp); |
sprintf (cmd, 4095, "%s -d -k -e %s", basecmd, env); |
#endif |
#endif |
|
|
system (cmd); |
system (cmd); |
Line 1273 int fm_daemonctl (short action, short ob
|
Line 1325 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 1308 int fm_daemonctl (short action, short ob
|
Line 1362 int fm_daemonctl (short action, short ob
|
if (line[0] == '[') { |
if (line[0] == '[') { |
strncpy (env, &(line[1]), 255); |
strncpy (env, &(line[1]), 255); |
env[strlen (env) - 2] = '\0'; |
env[strlen (env) - 2] = '\0'; |
snprintf (tmps, 255, "%s,", env); |
snprintf (tmps, sizeof (tmps) - 1, "%s,", env); |
strncat (envlist, tmps, BIGSTR - 1); |
strncat (envlist, tmps, BIGSTR - 1); |
} |
} |
} |
} |
Line 1352 int fm_daemonctl (short action, short ob
|
Line 1406 int fm_daemonctl (short action, short ob
|
switch (action) { |
switch (action) { |
|
|
case ACT_START: |
case ACT_START: |
result = fm_start_environment (cur_env, e_user, e_grp); |
result = fm_start_environment (cur_env); |
if (result == TRUE) { |
if (result == TRUE) { |
fprintf (stderr, "[OK]\n"); |
fprintf (stderr, "[OK]\n"); |
} |
} |
Line 1368 int fm_daemonctl (short action, short ob
|
Line 1422 int fm_daemonctl (short action, short ob
|
} |
} |
else { |
else { |
fprintf (stderr, "[FAIL]\n"); |
fprintf (stderr, "[FAIL]\n"); |
|
retval++; |
} |
} |
break; |
break; |
|
|
case ACT_RESTART: |
case ACT_RESTART: |
if (fm_stop_environment (cur_env) == TRUE) { |
if (fm_stop_environment (cur_env) == TRUE) { |
result = fm_start_environment (cur_env, e_user, e_grp); |
result = fm_start_environment (cur_env); |
if (result == TRUE) { |
if (result == TRUE) { |
fprintf (stderr, "[OK]\n"); |
fprintf (stderr, "[OK]\n"); |
} |
} |
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 1390 int fm_daemonctl (short action, short ob
|
Line 1447 int fm_daemonctl (short action, short ob
|
case ACT_STATUS: |
case ACT_STATUS: |
epid = fm_get_pid (cur_env); |
epid = fm_get_pid (cur_env); |
if (epid > -1) { |
if (epid > -1) { |
fprintf (stderr, " - %s environment daemon running as pid %d\n", cur_env, epid); |
fprintf (stderr, " - %s environment daemon running as pid %ld\n", cur_env, epid); |
} |
} |
else { |
else { |
fprintf (stderr, " - %s environment daemon does not appear to be running\n", cur_env); |
fprintf (stderr, " - %s environment daemon does not appear to be running\n", cur_env); |
Line 1403 int fm_daemonctl (short action, short ob
|
Line 1460 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 1416 void fm_checkperms(void)
|
Line 1473 void fm_checkperms(void)
|
void fm_reconfigure(void) |
void fm_reconfigure(void) |
{ |
{ |
char config_backup[4096]; |
char config_backup[4096]; |
char vers[4096]; |
|
|
|
int retval; |
int retval; |
|
|
Line 1425 void fm_reconfigure(void)
|
Line 1481 void fm_reconfigure(void)
|
exit (1); |
exit (1); |
} |
} |
|
|
snprintf (config_backup, 4095, "%s.orig", config_file); |
snprintf (config_backup, sizeof (config_backup) - 1, "%s.orig", config_file); |
|
|
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, 1); |
|
#endif |
|
|
if (retval == 0) { |
if (retval == 0) { |
fprintf (stderr, "[OK]\n"); |
fprintf (stderr, "[OK]\n"); |
Line 1447 void fm_reconfigure(void)
|
Line 1507 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, sizeof (tbuf) - 1, "%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) |
{ |
{ |
char rundir[4096]; |
char rundir[4096]; |
char varbase[4096]; |
char varbase[4096]; |
|
char vardir[4096]; |
char sysrtn[4096]; |
char sysrtn[4096]; |
char sysgbl[4096]; |
char sysgbl[4096]; |
char usrrtn[4096]; |
char usrrtn[4096]; |
Line 1463 void fm_configure (void)
|
Line 1540 void fm_configure (void)
|
char jnlhostid[4096]; |
char jnlhostid[4096]; |
char jnlcut[4096]; |
char jnlcut[4096]; |
char hostid[4096]; |
char hostid[4096]; |
|
char logdir[4096]; |
|
|
char confbase[4096]; |
char confbase[4096]; |
char envbase[4096]; |
char envbase[4096]; |
|
|
Line 1472 void fm_configure (void)
|
Line 1550 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; |
|
|
|
DIR *dir; |
DIR *dir; |
struct dirent *ent; |
struct dirent *ent; |
Line 1482 void fm_configure (void)
|
Line 1561 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__) |
|
struct group *d_grp; |
|
struct passwd *d_user; |
|
|
if (geteuid () != 0) { |
if (geteuid () != 0) { |
fprintf (stderr, "fmadm: not superuser\n"); |
fprintf (stderr, "fmadm: not superuser\n"); |
exit (1); |
exit (1); |
} |
} |
|
|
struct group *d_grp; |
|
struct passwd *d_user; |
|
gid_t d_gid; |
|
uid_t d_uid; |
|
|
|
if ((d_grp = getgrnam (groupname)) == NULL) { |
if ((d_grp = getgrnam (groupname)) == NULL) { |
fprintf (stderr, "fmadm: '%s' group must exist before configuring\n", groupname); |
fprintf (stderr, "fmadm: '%s' group must exist before configuring\n", groupname); |
exit (1); |
exit (1); |
} |
} |
d_gid = d_grp->gr_gid; |
|
|
|
if ((d_user = getpwnam (username)) == NULL) { |
if ((d_user = getpwnam (username)) == NULL) { |
fprintf (stderr, "fmadm: '%s' user must exist before configuring\n", username); |
fprintf (stderr, "fmadm: '%s' user must exist before configuring\n", username); |
exit (1); |
exit (1); |
} |
} |
d_uid = d_user->pw_uid; |
|
#endif |
#endif |
|
|
snprintf (varbase, 4095, "%s/freem", LOCALSTATEDIR); |
snprintf (logdir, sizeof (logdir) - 1, "/var/log/freem"); |
snprintf (rundir, 4095, "%s/freem/run", LOCALSTATEDIR); |
snprintf (vardir, sizeof (vardir) - 1, "%s", LOCALSTATEDIR); |
snprintf (sysrtn, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
snprintf (varbase, sizeof (varbase) - 1, "%s/freem", LOCALSTATEDIR); |
snprintf (sysgbl, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); |
snprintf (rundir, sizeof (rundir) - 1, "%s/freem/run", LOCALSTATEDIR); |
snprintf (usrrtn, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); |
snprintf (sysrtn, sizeof (sysrtn) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
snprintf (usrgbl, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); |
snprintf (sysgbl, sizeof (sysgbl) - 1, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); |
snprintf (jnldir, 4095, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment); |
snprintf (usrrtn, sizeof (usrrtn) - 1, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); |
snprintf (jnlfile, 4095, "%s/freem_journal_%s.dat", jnldir, fma_environment); |
snprintf (usrgbl, sizeof (usrgbl) - 1, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); |
snprintf (jnlmode, 3, "on"); |
snprintf (jnldir, sizeof (jnldir) - 1, "%s/freem/%s/journals", LOCALSTATEDIR, fma_environment); |
snprintf (jnlhostid, 4095, "DEFAULT"); |
snprintf (jnlfile, sizeof (jnlfile) - 1, "%s/freem_journal_%s.dat", jnldir, fma_environment); |
snprintf (jnlcut, 4095, "4294967000"); |
snprintf (jnlmode, sizeof (jnlmode) - 1, "on"); |
|
snprintf (jnlhostid, sizeof (jnlhostid) - 1, "DEFAULT"); |
|
snprintf (jnlcut, sizeof (jnlcut) - 1, "4294967000"); |
|
|
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 1601 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); |
|
|
snprintf (jnlhostid, 4095, "%s:%s", hostid, buf); |
snprintf (jnlhostid, sizeof (jnlhostid) - 1, "%s:%s", hostid, buf); |
snprintf (confbase, 4095, "%s/freem", SYSCONFDIR); |
snprintf (confbase, sizeof (confbase) - 1, "%s/freem", SYSCONFDIR); |
snprintf (envbase, 4095, "%s/freem/%s", SYSCONFDIR, fma_environment); |
snprintf (envbase, sizeof (envbase) - 1, "%s/freem/%s", SYSCONFDIR, fma_environment); |
snprintf (nsbase, 4095, "%s/freem/%s", LOCALSTATEDIR, fma_environment); |
snprintf (nsbase, sizeof (nsbase) - 1, "%s/freem/%s", LOCALSTATEDIR, fma_environment); |
|
|
#if defined(__OS2__) |
#if defined(__OS2__) |
{ |
{ |
char srcfile[PATHLEN]; |
char srcfile[PATHLEN]; |
char dstfile[PATHLEN]; |
char dstfile[PATHLEN]; |
|
|
snprintf (srcfile, PATHLEN, "%s/bin/freem.exe", PREFIX); |
snprintf (srcfile, PATHLEN - 1, "%s/bin/freem.exe", PREFIX); |
snprintf (dstfile, PATHLEN, "%s/bin/freemd.exe", PREFIX); |
snprintf (dstfile, PATHLEN - 1, "%s/bin/freemd.exe", PREFIX); |
|
|
unlink (dstfile); |
unlink (dstfile); |
|
|
Line 1557 void fm_configure (void)
|
Line 1631 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 (logdir, &etcstat) == -1) { |
|
fprintf (stderr, "fmadm: creating %s [logdir]\n", logdir); |
|
mkdir (logdir, 0775); |
|
set_permissions (logdir, username, groupname, 0775); |
|
} |
|
|
if (stat (SYSCONFDIR, &etcstat) == -1) { |
if (stat (SYSCONFDIR, &etcstat) == -1) { |
fprintf (stderr, "fmadm: creating %s [SYSCONFDIR]\n", SYSCONFDIR); |
fprintf (stderr, "fmadm: creating %s [SYSCONFDIR]\n", SYSCONFDIR); |
mkdir (SYSCONFDIR, 0775); |
mkdir (SYSCONFDIR, 0775); |
Line 1580 void fm_configure (void)
|
Line 1667 void fm_configure (void)
|
set_permissions (confbase, username, groupname, 0775); |
set_permissions (confbase, username, groupname, 0775); |
} |
} |
|
|
|
if (stat (vardir, &etcstat) == -1) { |
|
fprintf (stderr, "fmadm: creating %s [vardir]\n", vardir); |
|
mkdir (vardir, 0775); |
|
set_permissions (vardir, username, groupname, 0775); |
|
} |
|
|
if (stat (varbase, &etcstat) == -1) { |
if (stat (varbase, &etcstat) == -1) { |
fprintf (stderr, "fmadm: creating %s [varbase]\n", varbase); |
fprintf (stderr, "fmadm: creating %s [varbase]\n", varbase); |
mkdir (varbase, 0775); |
mkdir (varbase, 0775); |
Line 1611 void fm_configure (void)
|
Line 1704 void fm_configure (void)
|
} |
} |
|
|
|
|
snprintf (src_dir, 4095, "%s/freem/mlib", DATADIR); |
snprintf (src_dir, sizeof (src_dir) - 1, "%s/freem/mlib", DATADIR); |
snprintf (dest_dir, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
snprintf (dest_dir, sizeof (dest_dir) - 1, "%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, sizeof (buf) - 1, "%s/freem/%s/SYSTEM", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
snprintf (buf, 4095, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); |
snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
snprintf (buf, 4095, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM/routines", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
snprintf (buf, 4095, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); |
snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER/globals", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
snprintf (buf, 4095, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); |
snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/SYSTEM/globals", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
snprintf (buf, 4095, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); |
snprintf (buf, sizeof (buf) - 1, "%s/freem/%s/USER/routines", LOCALSTATEDIR, fma_environment); |
mkdir (buf, 0775); |
mkdir (buf, 0775); |
set_permissions (buf, username, groupname, 0775); |
set_permissions (buf, username, groupname, 0775); |
|
|
Line 1653 void fm_configure (void)
|
Line 1751 void fm_configure (void)
|
|
|
if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) { |
if ((strcmp (ent->d_name, ".") != 0) && (strcmp (ent->d_name, "..") != 0)) { |
|
|
snprintf (infile, 4095, "%s/%s", src_dir, ent->d_name); |
snprintf (infile, sizeof (infile) - 1, "%s/%s", src_dir, ent->d_name); |
snprintf (outfile, 4095, "%s/%s", dest_dir, ent->d_name); |
snprintf (outfile, sizeof (outfile) - 1, "%s/%s", dest_dir, ent->d_name); |
|
|
if (stat (outfile, &etcstat) == 0) { |
if (stat (outfile, &etcstat) == 0) { |
unlink (outfile); |
unlink (outfile); |
Line 1679 void fm_configure (void)
|
Line 1777 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, sizeof (buf) - 1, "[%s]", fma_environment); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "user=%s", env_user); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "group=%s", env_group); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "enabled=%s", env_enabled); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "env_path=%s/freem/%s", LOCALSTATEDIR, fma_environment); |
|
fm_write (fp, buf); |
|
|
|
fclose (fp); |
|
fprintf (stderr, "[OK]\n"); |
|
} |
|
else { |
|
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, sizeof (buf) - 1, "[SYSTEM]"); |
fclose (fp); |
fm_write (fp, buf); |
fprintf (stderr, "[OK]\n"); |
|
|
snprintf (buf, sizeof (buf) - 1, "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, sizeof (buf) - 1, "routines_path=%s", sysrtn); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "globals_path=%s", sysgbl); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "journal_file=%s", jnlfile); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "journal_mode=%s", jnlmode); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "journal_host_id=%s", jnlhostid); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "journal_cut_threshold=%s", jnlcut); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "zdate_format=%%x"); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "ztime_format=%%X"); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "\n[USER]"); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "root=%s/freem/%s/USER", LOCALSTATEDIR, fma_environment); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "routines_path=%s", usrrtn); |
|
fm_write (fp, buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "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, sizeof (buf) - 1, "%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, sizeof (buf) - 1, "%%x"); |
fm_write (fp, buf); |
update_conf (config_file, "SYSTEM", "zdate_format", buf); |
|
|
|
snprintf (buf, sizeof (buf) - 1, "%%X"); |
|
update_conf (config_file, "SYSTEM", "ztime_format", buf); |
|
|
snprintf (buf, 4095, "zdate_format=%%x"); |
/* USER */ |
fm_write (fp, buf); |
snprintf (buf, sizeof (buf) - 1, "%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 */ |
|
|