X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futils%2Fsetup.c;h=84d1d958ca8d94283160e5fca20d4f89e53c0985;hb=5e62c1bbe9d3014d5779a93ffd2537158e7c0197;hp=b0e827455a0cd45c7219f1c4fb5e5af0bb09e84a;hpb=c71df26b9d35c07eb9c1322a7e83caa86337ad82;p=citadel.git diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index b0e827455..84d1d958c 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -1,16 +1,9 @@ -/* - * Citadel setup utility - * - * Copyright (c) 1987-2019 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. - */ +// Citadel setup utility +// +// Copyright (c) 1987-2023 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure +// is subject to the terms of the GNU General Public License, version 3. #define SHOW_ME_VAPPEND_PRINTF #include @@ -32,10 +25,11 @@ #include #include #include -#include "citadel.h" +#include "../server/citadel_defs.h" +#include "../server/server.h" #include "axdefs.h" -#include "sysdep.h" -#include "citadel_dirs.h" +#include "../server/sysdep.h" +#include "../server/citadel_dirs.h" #ifdef ENABLE_NLS #ifdef HAVE_XLOCALE_H @@ -97,8 +91,7 @@ const char *setup_text[eMaxQuestions]; char *program_title; -void SetTitles(void) -{ +void SetTitles(void) { int have_run_dir; #ifndef HAVE_RUN_DIR have_run_dir = 1; @@ -185,7 +178,7 @@ void SetTitles(void) " 2. External LDAP - RFC 2307 POSIX schema\n" " 3. External LDAP - MS Active Directory schema\n" "\n" -"For help: http://www.citadel.org/doku.php/faq:installation:authmodes\n" +"For help: http://www.citadel.org/authmodes.html\n" "\n" "ANSWER \"0\" UNLESS YOU COMPLETELY UNDERSTAND THIS OPTION.\n"); @@ -213,24 +206,20 @@ void SetTitles(void) "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 + +void cls(void) { + printf("\033[2J\033[H\033[44m\033[1m\033[K\n"); + printf(" %s \033[K\n", program_title); + printf("\033[K\n"); + printf("\033[0m\n"); } void title(const char *text) { - printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<%s>\n", text); + cls(); + printf("\033[1m\033[32m<\033[33m%s\033[32m>\033[0m\n", text); } @@ -239,7 +228,7 @@ int yesno(const char *question, int default_value) { char buf[SIZ]; do { - printf("%s\n%s [%s] --> ", question, _("Yes/No"), ( default_value ? _("Yes") : _("No") )); + printf("\033[31m\033[32m%s\n%s [\033[33m%s\033[32m]\033[0m --> ", question, _("Yes/No"), ( default_value ? _("Yes") : _("No") )); if (fgets(buf, sizeof buf, stdin)) { answer = tolower(buf[0]); if ((buf[0]==0) || (buf[0]==13) || (buf[0]==10)) { @@ -260,8 +249,8 @@ int yesno(const char *question, int default_value) { void important_message(const char *title, const char *msgtext) { char buf[SIZ]; - 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); + cls(); + printf("%s\n%s\n\n", title, msgtext); printf("%s", _("Press return to continue...")); if (fgets(buf, sizeof buf, stdin)) { ; @@ -289,24 +278,26 @@ void display_error(char *error_message_format, ...) { void progress(char *text, long int curr, long int cmax) { - static long dots_printed = 0L; long a = 0; + long i = 0; if (curr == 0) { + cls(); printf("%s\n", text); - printf("...................................................."); - printf("..........................\r"); - dots_printed = 0; - } else if (curr == cmax) { + printf("\033[1m\033[33m[\033[32m............................................................................\033[33m]\033[0m\r"); + } + else if (curr == cmax) { printf("\r%79s\n", ""); - } else { + } + else { + printf("\033[1m\033[33m[\033[32m"); a = (curr * 100) / cmax; - a = a * 78; + a = a * 76; a = a / 100; - while (dots_printed < a) { + for (i=0; i/dev/null 2>&1"); if (rv != 0) { rv = system("service xinetd restart >/dev/null 2>&1"); @@ -518,17 +493,7 @@ void check_xinetd_entry(void) } -void disable_other_mtas(void) -{ - if ((getenv("ACT_AS_MTA") == NULL) || (getenv("ACT_AS_MTA") && strcasecmp(getenv("ACT_AS_MTA"), "yes") == 0)) { - /* Offer to disable other MTA's on the system. */ - /* FIXME this has to be rewritten to work in the new systemd-based world. */ - } -} - - -void strprompt(const char *prompt_title, const char *prompt_text, char *Target, char *DefValue) -{ +void strprompt(const char *prompt_title, const char *prompt_text, char *Target, char *DefValue) { char buf[SIZ] = ""; char setupmsg[SIZ]; @@ -553,8 +518,7 @@ void set_bool_val(int msgpos, int *ip, char *DefValue) { } -void set_str_val(int msgpos, char *Target, char *DefValue) -{ +void set_str_val(int msgpos, char *Target, char *DefValue) { strprompt(setup_titles[msgpos], setup_text[msgpos], Target, @@ -563,9 +527,8 @@ void set_str_val(int msgpos, char *Target, char *DefValue) } -/* like set_str_val() but for numeric values */ -void set_int_val(int msgpos, int *target, char *default_value) -{ +// like set_str_val() but for numeric values +void set_int_val(int msgpos, int *target, char *default_value) { char buf[32]; sprintf(buf, "%d", *target); do { @@ -575,8 +538,7 @@ void set_int_val(int msgpos, int *target, char *default_value) } -void edit_value(int curr) -{ +void edit_value(int curr) { struct passwd *pw = NULL; char ctdluidname[256]; char buf[SIZ]; @@ -679,135 +641,42 @@ void edit_value(int curr) } -/* - * Strip "db" entries out of /etc/nsswitch.conf - */ -void fixnss(void) { - FILE *fp_read; - int fd_write; - char buf[256]; - char buf_nc[256]; - char question[512]; - int i; - int file_changed = 0; - char new_filename[64]; - int rv; - - fp_read = fopen(NSSCONF, "r"); - if (fp_read == NULL) { - return; - } - - strcpy(new_filename, "/tmp/ctdl_fixnss_XXXXXX"); - fd_write = mkstemp(new_filename); - if (fd_write < 0) { - fclose(fp_read); - return; - } - - while (fgets(buf, sizeof buf, fp_read) != NULL) { - strcpy(buf_nc, buf); - for (i=0; buf_nc[i]; ++i) { - if (buf_nc[i] == '#') { - buf_nc[i] = 0; - break; - } - } - for (i=0; i 0) { - if ((isspace(buf_nc[i+2])) || (buf_nc[i+2]==0)) { - file_changed = 1; - strcpy(&buf_nc[i], &buf_nc[i+2]); - strcpy(&buf[i], &buf[i+2]); - if (buf[i]==32) { - strcpy(&buf_nc[i], &buf_nc[i+1]); - strcpy(&buf[i], &buf[i+1]); - } - } - } - } - } - long buflen = strlen(buf); - if (write(fd_write, buf, buflen) != buflen) { - fclose(fp_read); - close(fd_write); - unlink(new_filename); - return; - } - } - - fclose(fp_read); - - if (!file_changed) { - unlink(new_filename); - return; - } - - 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" - ) +// Messages that are no longer in use. +// We keep them here so we don't lose the translations if we need them later. +void unused_messages(void) { + 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 failed"), + _("Setup is finished, but the Citadel server failed to start.\n" + "Go back and check your configuration.\n") + ); + important_message(_("Setup finished"), + _("Setup is finished. You may now start the server.") ); - - if (yesno(question, 1)) { - snprintf(buf, sizeof 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); } -/* - * Messages that are no longer in use. - * We keep them here so we don't lose the translations if we need them later. - */ -#if 0 -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 failed"), -_("Setup is finished, but the Citadel server failed to start.\n" -"Go back and check your configuration.\n"); -important_message(_("Setup finished"), -_("Setup is finished. You may now start the server.")); -#endif - - -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { int a, i; int curr; char buf[1024]; char aaa[128]; - int relh = 0; - int home = 0; - char relhome[PATH_MAX]=""; char ctdldir[PATH_MAX]=CTDLDIR; struct passwd *pw; gid_t gid; char *activity = NULL; - /* Keep a mild groove on */ - program_title = _("Citadel setup program"); + // Keep a mild groove on + program_title = _("Citadel Server setup"); - /* set an invalid setup type */ + // set an invalid setup type setup_type = (-1); - /* parse command line args */ + // parse command line args for (a = 0; a < argc; ++a) { if (!strncmp(argv[a], "-u", 2)) { strcpy(aaa, argv[a]); @@ -815,32 +684,20 @@ int main(int argc, char *argv[]) setup_type = atoi(aaa); } else if (!strncmp(argv[a], "-h", 2)) { - relh=argv[a][2]!='/'; - if (!relh) { - safestrncpy(ctdl_home_directory, &argv[a][2], sizeof ctdl_home_directory); - } else { - safestrncpy(relhome, &argv[a][2], sizeof relhome); - } - home = 1; + safestrncpy(ctdldir, &argv[a][2], sizeof ctdldir); } } - calc_dirs_n_files(relh, home, relhome, ctdldir, 0); - SetTitles(); - - enable_home = ( relh | home ); - - if (chdir(ctdl_run_dir) != 0) { - display_error("%s: [%s]\n", _("The directory you specified does not exist"), ctdl_run_dir); + if (chdir(ctdldir) != 0) { + fprintf(stderr, "sendcommand: %s: %s\n", ctdldir, strerror(errno)); exit(errno); } + SetTitles(); - /* - * Connect to the running Citadel server. - */ + // Connect to the running Citadel server. char *connectingmsg = _("Connecting to Citadel server"); - for (i=0; ((i<30) && (serv_sock < 0)) ; ++i) { /* wait for server to start up */ + for (i=0; ((i<30) && (serv_sock < 0)) ; ++i) { // wait for server to start up progress(connectingmsg, i, 30); serv_sock = uds_connectsock(file_citadel_admin_socket); sleep(1); @@ -856,18 +713,14 @@ int main(int argc, char *argv[]) exit(1); } - /* - * read the server greeting - */ + // read the server greeting serv_gets(buf); if (buf[0] != '2') { display_error("%s\n", buf); exit(2); } - /* - * Are we connected to the correct Citadel server? - */ + // Are we connected to the correct Citadel server? serv_puts("INFO"); serv_gets(buf); if (buf[0] != '1') { @@ -878,9 +731,7 @@ int main(int argc, char *argv[]) while (serv_gets(buf), strcmp(buf, "000")) { if (a == 5) { if (atoi(buf) != REV_LEVEL) { - display_error("%s\n", - _("Your setup program and Citadel server are from different versions.") - ); + display_error("%s\n", _("Your setup program and Citadel server are from different versions.")); exit(4); } } @@ -889,7 +740,7 @@ int main(int argc, char *argv[]) printf("\n\n\n *** %s ***\n\n", program_title); - /* Go through a series of dialogs prompting for config info */ + // Go through a series of dialogs prompting for config info for (curr = 1; curr < eMaxQuestions; ++curr) { edit_value(curr); @@ -897,12 +748,11 @@ int main(int argc, char *argv[]) && (getconf_int("c_auth_mode") != AUTHMODE_LDAP) && (getconf_int("c_auth_mode") != AUTHMODE_LDAP_AD) ) { - curr += 5; /* skip LDAP questions if we're not authenticating against LDAP */ + curr += 5; // skip LDAP questions if we're not authenticating against LDAP } if (curr == eSysAdminName) { - if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { - /* for native auth mode, fetch the admin's existing pw */ + if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { // for native auth mode, fetch the admin's existing pw snprintf(buf, sizeof buf, "AGUP %s", admin_name); serv_puts(buf); serv_gets(buf); @@ -911,28 +761,28 @@ int main(int argc, char *argv[]) } } else { - ++curr; /* skip the password question for non-native auth modes */ + ++curr; // skip the password question for non-native auth modes } } } if ((pw = getpwuid( getconf_int("c_ctdluid") )) == NULL) { gid = getgid(); - } else { + } + else { gid = pw->pw_gid; } - if (create_run_directories(getconf_int("c_ctdluid"), gid) != 0) { - display_error("%s\n", _("failed to create directories")); - } + // setup now must be run after Citadel Server is already running, so we don't need this anymore. + //if (create_run_directories(getconf_int("c_ctdluid"), gid) != 0) { + //display_error("%s\n", _("failed to create directories")); + //} activity = _("Reconfiguring Citadel server"); progress(activity, 0, 5); - sleep(1); /* Let the message appear briefly */ + sleep(1); // Let the message appear briefly - /* - * Create the administrator account. It's ok if the command fails if this user already exists. - */ + // Create the administrator account. It's ok if the command fails if this user already exists. if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { progress(activity, 1, 5); snprintf(buf, sizeof buf, "CREU %s|%s", admin_name, admin_pass); @@ -942,9 +792,7 @@ int main(int argc, char *argv[]) } progress(activity, 3, 5); - /* - * Assign the desired password and access level to the administrator account. - */ + // Assign the desired password and access level to the administrator account. if (getconf_int("c_auth_mode") == AUTHMODE_NATIVE) { snprintf(buf, sizeof buf, "AGUP %s", admin_name); serv_puts(buf); @@ -963,13 +811,9 @@ int main(int argc, char *argv[]) } progress(activity, 5, 5); - check_xinetd_entry(); /* Check /etc/xinetd.d/telnet */ - disable_other_mtas(); /* Offer to disable other MTAs */ - fixnss(); /* Check for the 'db' nss and offer to disable it */ + check_xinetd_entry(); // Check /etc/xinetd.d/telnet - /* - * Restart citserver - */ + // Restart citserver activity = _("Restarting Citadel server to apply changes"); progress(activity, 0, 51); @@ -989,12 +833,12 @@ int main(int argc, char *argv[]) close(serv_sock); serv_sock = (-1); - for (i=3; i<=6; ++i) { /* wait for server to shut down */ + for (i=3; i<=6; ++i) { // wait for server to shut down progress(activity, i, 51); sleep(1); } - for (i=7; ((i<=48) && (serv_sock < 0)) ; ++i) { /* wait for server to start up */ + for (i=7; ((i<=48) && (serv_sock < 0)) ; ++i) { // wait for server to start up progress(activity, i, 51); serv_sock = uds_connectsock(file_citadel_admin_socket); sleep(1);