/*
* Citadel setup utility
+ *
+ * Copyright (c) 1987-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*/
#define SHOW_ME_VAPPEND_PRINTF
#else
have_run_dir = 0;
#endif
+
+#ifdef ENABLE_NLS
+ setlocale(LC_MESSAGES, getenv("LANG"));
+
+ bindtextdomain("citadel-setup", LOCALEDIR"/locale");
+ textdomain("citadel-setup");
+ bind_textdomain_codeset("citadel-setup","UTF8");
+#endif
+
setup_titles[eCitadelHomeDir] = _("Citadel Home Directory");
if (have_run_dir)
setup_text[eCitadelHomeDir] = _(
setup_text[eIP_ADDR] = _(
"Please specify the IP address which the server should be listening to. "
"You can name a specific IPv4 or IPv6 address, or you can specify\n"
-"'*' for 'any address', '::' for 'any IPv6 address', or '0.0.0.0'\n"
-"for 'any IPv4 address'. If you leave this blank, Citadel will\n"
+"\"*\" for \"any address\", \"::\" for \"any IPv6 address\", or \"0.0.0.0\"\n"
+"for \"any IPv4 address\". If you leave this blank, Citadel will\n"
"listen on all addresses. "
"This can usually be left to the default unless multiple instances of Citadel "
"are running on the same computer.");
"If you entered a Bind DN in the previous question, you must now enter\n"
"the password associated with that account. Otherwise, you can leave this\n"
"blank.\n");
+
+#if 0
+// Debug loading of locales... Strace does a better job though.
+ printf("Message catalog directory: %s\n", bindtextdomain("citadel-setup", LOCALEDIR"/locale"));
+ printf("Text domain: %s\n", textdomain("citadel-setup"));
+ printf("Text domain Charset: %s\n", bind_textdomain_codeset("citadel-setup","UTF8"));
+ {
+ int i;
+ for (i = 0; i < eMaxQuestions; i++)
+ printf("%s - %s\n", setup_titles[i], _(setup_titles[i]));
+ exit(0);
+ }
+#endif
}
/*
struct config config;
-
-struct config config;
int direction;
case UI_TEXT:
do {
- printf("%s\nYes/No [%s] --> ",
- question,
- ( default_value ? "Yes" : "No" )
+ printf("%s\n%s [%s] --> ",
+ question,
+ _("Yes/No"),
+ ( default_value ? _("Yes") : _("No") )
);
if (fgets(buf, sizeof buf, stdin))
{
case UI_TEXT:
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" %s \n\n%s\n\n", title, msgtext);
- printf("Press return to continue...");
+ printf("%s", _("Press return to continue..."));
if (fgets(buf, sizeof buf, stdin));
break;
getenv("CTDL_DIALOG"),
msgtext);
rv = system(buf);
+ if (rv != 0)
+ fprintf(stderr, _("failed to run the dialog command\n"));
break;
case UI_SILENT:
fprintf(stderr, "%s\n", msgtext);
void important_msgnum(int msgnum)
{
- important_message("Important Message", setup_text[msgnum]);
+ important_message(_("Important Message"), setup_text[msgnum]);
}
-void display_error(char *error_message)
+void display_error(char *error_message_format, ...)
{
- important_message("Error", error_message);
+ StrBuf *Msg;
+ va_list arg_ptr;
+
+ Msg = NewStrBuf();
+ va_start(arg_ptr, error_message_format);
+ StrBufVAppendPrintf(Msg,
+ error_message_format,
+ arg_ptr);
+ va_end(arg_ptr);
+
+ important_message(_("Error"), ChrPtr(Msg));
+ FreeStrBuf(&Msg);
}
void progress(char *text, long int curr, long int cmax)
if (getservbyname(SERVICE_NAME, PROTO_NAME) == NULL) {
for (i=0; i<=2; ++i) {
- progress("Adding service entry...", i, 2);
+ progress(_("Adding service entry..."), i, 2);
if (i == 0) {
sfp = fopen("/etc/services", "a");
if (sfp == NULL) {
- sprintf(errmsg, "Cannot open /etc/services: %s", strerror(errno));
+ sprintf(errmsg, "%s /etc/services: %s", _("Cannot open"), strerror(errno));
display_error(errmsg);
} else {
fprintf(sfp, "%s 504/tcp\n", SERVICE_NAME);
/* Other errors might mean something really did go wrong.
*/
- sprintf(buf, "Cannot open /etc/inittab: %s", strerror(errno));
+ sprintf(buf, "%s /etc/inittab: %s", _("Cannot open"), strerror(errno));
display_error(buf);
return;
}
strcpy(outfilename, "/tmp/ctdlsetup.XXXXXX");
outfp = fdopen(mkstemp(outfilename), "w+");
if (outfp == NULL) {
- sprintf(buf, "Cannot open %s: %s", outfilename, strerror(errno));
+ sprintf(buf, "%s %s: %s", _("Cannot open"), outfilename, strerror(errno));
display_error(buf);
fclose(infp);
return;
while (fgets(buf, sizeof buf, infp) != NULL) {
if (strstr(buf, looking_for) != NULL) {
rv = fwrite("#", 1, 1, outfp);
+ if (rv == -1)
+ {
+ display_error("%s %s\n",
+ _("failed to modify inittab"),
+ strerror(errno));
+ }
++changes_made;
}
rv = fwrite(buf, strlen(buf), 1, outfp);
+ if (rv == -1)
+ {
+ display_error("%s %s\n",
+ _("failed to modify inittab"),
+ strerror(errno));
+ }
}
fclose(infp);
fp = fopen(initfile, "r");
if (fp != NULL) {
- if (yesno("Citadel already appears to be configured to start at boot.\n"
- "Would you like to keep your boot configuration as is?\n", 1) == 1) {
+ if (yesno(_("Citadel already appears to be configured to start at boot.\n"
+ "Would you like to keep your boot configuration as is?\n"), 1) == 1) {
return;
}
fclose(fp);
}
- if (yesno("Would you like to automatically start Citadel at boot?\n", 1) == 0) {
+ if (yesno(_("Would you like to automatically start Citadel at boot?\n"), 1) == 0) {
return;
}
fp = fopen(initfile, "w");
if (fp == NULL) {
- display_error("Cannot create /etc/init.d/citadel");
+ display_error("%s /etc/init.d/citadel", _("Cannot create"));
return;
}
/* Set up the run levels. */
rv = system("/bin/rm -f /etc/rc?.d/[SK]??citadel 2>/dev/null");
+ if (rv != 0)
+ display_error(_("failed to remove system V init links \n"));
+
snprintf(command, sizeof(command), "for x in 2 3 4 5 ; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/S79citadel ; done 2>/dev/null", initfile);
rv = system(command);
+ if (rv != 0)
+ display_error(_("failed to set system V init links \n"));
+
snprintf(command, sizeof(command),"for x in 0 6 S; do [ -d /etc/rc$x.d ] && ln -s %s /etc/rc$x.d/K30citadel ; done 2>/dev/null", initfile);
rv = system(command);
-
+ if (rv != 0)
+ display_error(_("failed to set system V init links \n"));
}
}
else {
snprintf(buf, sizeof buf,
- "Setup can configure the \"xinetd\" service to automatically\n"
- "connect incoming telnet sessions to Citadel, bypassing the\n"
- "host system login: prompt. Would you like to do this?\n"
- );
+ _("Setup can configure the \"xinetd\" service to automatically\n"
+ "connect incoming telnet sessions to Citadel, bypassing the\n"
+ "host system login: prompt. Would you like to do this?\n"
+ ));
if (yesno(buf, 1) == 0) {
return;
}
/* Now try to restart the service */
rv = system("/etc/init.d/xinetd restart >/dev/null 2>&1");
+ if (rv != 0)
+ display_error(_("failed to restart xinetd.\n"));
}
/* Offer to replace other MTA with the vastly superior Citadel :) */
snprintf(buf, sizeof buf,
- "You appear to have the \"%s\" email program\n"
- "running on your system. If you want Citadel mail\n"
- "connected with %s, you will have to manually integrate\n"
- "them. It is preferable to disable %s, and use Citadel's\n"
- "SMTP, POP3, and IMAP services.\n\n"
- "May we disable %s so that Citadel has access to ports\n"
- "25, 110, and 143?\n",
- mta, mta, mta, mta
+ "%s \"%s\" %s%s%s%s%s%s%s",
+ _("You appear to have the "),
+ mta,
+ _(" email program\n"
+ "running on your system. If you want Citadel mail\n"
+ "connected with "),
+ mta,
+ _(" you will have to manually integrate\n"
+ "them. It is preferable to disable "),
+ mta,
+ _(", and use Citadel's\n"
+ "SMTP, POP3, and IMAP services.\n\n"
+ "May we disable "),
+ mta,
+ _("so that Citadel has access to ports\n"
+ "25, 110, and 143?\n")
);
if (yesno(buf, 1) == 0) {
return;
sprintf(buf, "for x in /etc/rc*.d/S*%s; do mv $x `echo $x |sed s/S/K/g`; done >/dev/null 2>&1", mta);
rv = system(buf);
+ if (rv != 0)
+ display_error("%s %s.\n", _("failed to disable other mta"), mta);
+
sprintf(buf, "/etc/init.d/%s stop >/dev/null 2>&1", mta);
rv = system(buf);
+ if (rv != 0)
+ display_error(" %s.\n", _("failed to disable other mta"), mta);
}
const char *other_mtas[] = {
case UI_TEXT:
title(prompt_title);
printf("\n%s\n", prompt_text);
- printf("This is currently set to:\n%s\n", Target);
- printf("Enter new value or press return to leave unchanged:\n");
+ printf("%s\n%s\n", _("This is currently set to:"), Target);
+ printf("%s\n", _("Enter new value or press return to leave unchanged:"));
if (fgets(buf, sizeof buf, stdin)){
buf[strlen(buf) - 1] = 0;
}
Target,
dialog_result);
rv = system(buf);
+ if (rv != 0)
+ fprintf(stderr, "failed to run Dialog.\n");
+
fp = fopen(dialog_result, "r");
if (fp != NULL) {
if (fgets(Target, sizeof buf, fp)) {
}
break;
case UI_SILENT:
- strcpy(Target, DefValue);
+ if (*DefValue != '\0')
+ strcpy(Target, DefValue);
break;
}
}
int rv;
if ((fd = creat(file_citadel_config, S_IRUSR | S_IWUSR)) == -1) {
- display_error("setup: cannot open citadel.config");
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
cleanup(1);
}
fp = fdopen(fd, "wb");
if (fp == NULL) {
- display_error("setup: cannot open citadel.config");
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
cleanup(1);
+ return;
}
rv = fwrite((char *) &config, sizeof(struct config), 1, fp);
+
+ if (rv == -1)
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot write"), file_citadel_config, strerror(errno));
+
fclose(fp);
}
-void migrate_old_installs(void)
-{
- int rv;
- rv = system("exec /bin/rm -fr ./rooms ./chatpipes ./expressmsgs ./sessions 2>/dev/null");
- unlink("citadel.log");
- unlink("weekly");
-}
-
-
/*
* Strip "db" entries out of /etc/nsswitch.conf
*/
char buf_nc[256];
char question[512];
int i;
- int changed = 0;
int file_changed = 0;
char new_filename[64];
int rv;
}
while (fgets(buf, sizeof buf, fp_read) != NULL) {
- changed = 0;
strcpy(buf_nc, buf);
for (i=0; i<strlen(buf_nc); ++i) {
if (buf_nc[i] == '#') {
if (!strncasecmp(&buf_nc[i], "db", 2)) {
if (i > 0) {
if ((isspace(buf_nc[i+2])) || (buf_nc[i+2]==0)) {
- changed = 1;
file_changed = 1;
strcpy(&buf_nc[i], &buf_nc[i+2]);
strcpy(&buf[i], &buf[i+2]);
}
snprintf(question, sizeof question,
- "\n"
- "/etc/nsswitch.conf is configured to use the 'db' module for\n"
- "one or more services. This is not necessary on most systems,\n"
- "and it is known to crash the Citadel server when delivering\n"
- "mail to the Internet.\n"
- "\n"
- "Do you want this module to be automatically disabled?\n"
- "\n"
+ _(
+ "\n"
+ "/etc/nsswitch.conf is configured to use the 'db' module for\n"
+ "one or more services. This is not necessary on most systems,\n"
+ "and it is known to crash the Citadel server when delivering\n"
+ "mail to the Internet.\n"
+ "\n"
+ "Do you want this module to be automatically disabled?\n"
+ "\n"
+ )
);
if (yesno(question, 1)) {
sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
rv = system(buf);
+ if (rv != 0)
+ fprintf(stderr, "failed to edit %s.\n", NSSCONF);
+
chmod(NSSCONF, 0644);
}
unlink(new_filename);
if (!access("/etc/init.d/citadel", X_OK)) {
rv = system("/etc/init.d/citadel start");
+ if (rv != 0)
+ fprintf(stderr, "failed to call our initscript.");
sleep(3);
}
}
if (setup_type != UI_SILENT)
- important_message("Setup finished",
- "Setup of the Citadel server is complete.\n"
- "If you will be using WebCit, please run its\n"
- "setup program now; otherwise, run './citadel'\n"
- "to log in.\n");
+ important_message(_("Setup finished"),
+ _("Setup of the Citadel server is complete.\n"
+ "If you will be using WebCit, please run its\n"
+ "setup program now; otherwise, run './citadel'\n"
+ "to log in.\n"));
}
else {
- important_message("Setup failed",
- "Setup is finished, but the Citadel server failed to start.\n"
- "Go back and check your configuration.\n"
- );
+ important_message(_("Setup failed"),
+ _("Setup is finished, but the Citadel server failed to start.\n"
+ "Go back and check your configuration.\n")
+ );
}
}
else {
- important_message("Setup finished",
- "Setup is finished. You may now start the server.");
+ important_message(_("Setup finished"),
+ _("Setup is finished. You may now start the server."));
+ }
+}
+
+
+
+#define GetDefaultVALINT(CFGNAME, DEFL) GetDefaultValInt(&config.CFGNAME, "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValInt(int *WhereTo, const char *VarName, int DefVal)
+{
+ const char *ch;
+ if (*WhereTo == 0) *WhereTo = DefVal;
+
+ if ((setup_type == UI_SILENT) &&
+ (ch = getenv(VarName), ch != NULL))
+ {
+ *WhereTo = atoi(ch);
+ }
+}
+#define GetDefaultVALCHAR(CFGNAME, DEFL) GetDefaultValChar(&config.CFGNAME, "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValChar(char *WhereTo, const char *VarName, char DefVal)
+{
+ const char *ch;
+ if (*WhereTo == 0) *WhereTo = DefVal;
+
+ if ((setup_type == UI_SILENT) &&
+ (ch = getenv(VarName), ch != NULL))
+ {
+ *WhereTo = atoi(ch);
+ }
+}
+#define GetDefaultVALSTR(CFGNAME, DEFL) GetDefaultValStr(&config.CFGNAME[0], sizeof(config.CFGNAME), "CITADEL_"#CFGNAME, DEFL)
+void GetDefaultValStr(char *WhereTo, size_t nMax, const char *VarName, const char *DefVal)
+{
+ const char *ch;
+ if (*WhereTo == '\0')
+ safestrncpy(WhereTo, DefVal, nMax);
+
+ if ((setup_type == UI_SILENT) &&
+ (ch = getenv(VarName), ch != NULL))
+ {
+ safestrncpy(WhereTo, ch, nMax);
}
}
+
void set_default_values(void)
{
struct passwd *pw;
uname(&my_utsname);
/* set some sample/default values in place of blanks... */
- if (IsEmptyStr(config.c_nodename))
- safestrncpy(config.c_nodename, my_utsname.nodename,
- sizeof config.c_nodename);
+ GetDefaultVALSTR(c_nodename, my_utsname.nodename);
strtok(config.c_nodename, ".");
if (IsEmptyStr(config.c_fqdn) ) {
if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
safestrncpy(config.c_fqdn, my_utsname.nodename, sizeof config.c_fqdn);
}
}
- if (IsEmptyStr(config.c_humannode)) {
- strcpy(config.c_humannode, "My System");
- }
- if (IsEmptyStr(config.c_phonenum)) {
- strcpy(config.c_phonenum, "US 800 555 1212");
- }
- if (config.c_initax == 0) {
- config.c_initax = 4;
- }
- if (IsEmptyStr(config.c_moreprompt)) strcpy(config.c_moreprompt, "<more>");
- if (IsEmptyStr(config.c_twitroom)) strcpy(config.c_twitroom, "Trashcan");
- if (IsEmptyStr(config.c_baseroom)) strcpy(config.c_baseroom, BASEROOM);
- if (IsEmptyStr(config.c_aideroom)) strcpy(config.c_aideroom, "Aide");
- if (config.c_port_number == 0) {
- config.c_port_number = 504;
- }
- if (config.c_sleeping == 0) {
- config.c_sleeping = 900;
- }
+ GetDefaultVALSTR(c_humannode, _("My System"));
+ GetDefaultVALSTR(c_phonenum, _("US 800 555 1212"));
+
+ GetDefaultVALCHAR(c_initax, 4);
+
+ GetDefaultVALSTR(c_moreprompt, "<more>");
+ GetDefaultVALSTR(c_twitroom, "Trashcan");
+ GetDefaultVALSTR(c_baseroom, BASEROOM);
+ GetDefaultVALSTR(c_aideroom, "Aide");
+ GetDefaultVALINT(c_port_number, 504);
+
+ GetDefaultVALINT(c_sleeping, 900);
+
if (config.c_ctdluid == 0) {
pw = getpwnam("citadel");
if (pw != NULL) {
/*
* Default port numbers for various services
*/
- if (config.c_smtp_port == 0) config.c_smtp_port = 25;
- if (config.c_pop3_port == 0) config.c_pop3_port = 110;
- if (config.c_imap_port == 0) config.c_imap_port = 143;
- if (config.c_msa_port == 0) config.c_msa_port = 587;
- if (config.c_smtps_port == 0) config.c_smtps_port = 465;
- if (config.c_pop3s_port == 0) config.c_pop3s_port = 995;
- if (config.c_imaps_port == 0) config.c_imaps_port = 993;
- if (config.c_pftcpdict_port == 0) config.c_pftcpdict_port = -1;
- if (config.c_managesieve_port == 0) config.c_managesieve_port = 2020;
- if (config.c_xmpp_c2s_port == 0) config.c_xmpp_c2s_port = 5222;
- if (config.c_xmpp_s2s_port == 0) config.c_xmpp_s2s_port = 5269;
+ GetDefaultVALINT(c_smtp_port, 25);
+ GetDefaultVALINT(c_pop3_port, 110);
+ GetDefaultVALINT(c_imap_port, 143);
+ GetDefaultVALINT(c_msa_port, 587);
+ GetDefaultVALINT(c_smtps_port, 465);
+ GetDefaultVALINT(c_pop3s_port, 995);
+ GetDefaultVALINT(c_imaps_port, 993);
+ GetDefaultVALINT(c_pftcpdict_port, -1);
+ GetDefaultVALINT(c_managesieve_port, 2020);
+ GetDefaultVALINT(c_xmpp_c2s_port, 5222);
+ GetDefaultVALINT(c_xmpp_s2s_port, 5269);
}
*/
if ((a = open(file_citadel_config, O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR)) == -1) {
- display_error("setup: cannot append citadel.config");
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot append"), file_citadel_config, strerror(errno));
cleanup(errno);
}
fp = fdopen(a, "ab");
if (fp == NULL) {
- display_error("setup: cannot append citadel.config");
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot append"), file_citadel_config, strerror(errno));
cleanup(errno);
}
for (a = 0; a < sizeof(struct config); ++a) {
/* now we re-open it, and read the old or blank configuration */
fp = fopen(file_citadel_config, "rb");
if (fp == NULL) {
- display_error("setup: cannot open citadel.config");
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot open"), file_citadel_config, strerror(errno));
cleanup(errno);
+ return;
}
rv = fread((char *) &config, sizeof(struct config), 1, fp);
+ if (rv == -1)
+ display_error("%s citadel.config [%s][%s]\n", _("setup: cannot write"), file_citadel_config, strerror(errno));
fclose(fp);
}
setup_type = discover_ui();
}
if (info_only == 1) {
- important_message("Citadel Setup", CITADEL);
+ important_message(_("Citadel Setup"), CITADEL);
cleanup(0);
}
enable_home = ( relh | home );
if (chdir(ctdl_run_dir) != 0) {
- char errmsg[SIZ];
- sprintf(errmsg, "The directory you specified does not exist: [%s]\n", ctdl_run_dir);
-
- important_message("Citadel Setup", errmsg);
+ display_error(_("Citadel Setup"),
+ "%s: [%s]\n",
+ _("The directory you specified does not exist"),
+ ctdl_run_dir);
cleanup(errno);
}
/* Try to stop Citadel if we can */
if (!access("/etc/init.d/citadel", X_OK)) {
rv = system("/etc/init.d/citadel stop");
+ if (rv != 0)
+ fprintf(stderr, _("failed to stop us using the initscript.\n"));
}
/* Make sure Citadel is not running. */
if (test_server(relhome, enable_home) == 0) {
- important_message("Citadel Setup",
- "The Citadel service is still running.\n"
- "Please stop the service manually and run "
- "setup again.");
+ important_message(_("Citadel Setup"),
+ _("The Citadel service is still running.\n"
+ "Please stop the service manually and run "
+ "setup again."));
cleanup(1);
}
case UI_TEXT:
printf("\n\n\n"
- " *** Citadel setup program ***\n\n");
+ " *** %s ***\n\n",
+ _("Citadel setup program"));
break;
}
if (old_setup_level < 555) {
important_message(
- "Citadel Setup",
- "This Citadel installation is too old to be upgraded."
+ _("Citadel Setup"),
+ _("This Citadel installation is too old to be upgraded.")
);
cleanup(1);
}
write_config_to_disk();
- migrate_old_installs(); /* Delete files and directories used by older Citadel versions */
-
if ( ((setup_type == UI_SILENT)
&& (getenv("ALTER_ETC_SERVICES")!=NULL))
|| (setup_type != UI_SILENT)
fixnss(); /* Check for the 'db' nss and offer to disable it */
#endif
- progress("Setting file permissions", 1, 3);
+ progress(_("Setting file permissions"), 1, 3);
rv = chown(file_citadel_config, config.c_ctdluid, gid);
- progress("Setting file permissions", 2, 3);
+ progress(_("Setting file permissions"), 2, 3);
rv = chmod(file_citadel_config, S_IRUSR | S_IWUSR);
- progress("Setting file permissions", 3, 3);
+ progress(_("Setting file permissions"), 3, 3);
check_init_script(relhome);
cleanup(0);