X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futils%2Fsetup.c;h=9083fb8d48d77ed85d7808f161f2192c2ae2c69b;hb=b9a2089d59579d13694e08b299c2aaf44ef9df6c;hp=e718e3ddeaa5afad32723a466471d0a85b132ea7;hpb=1c5d73df9d3bc276c342d90e31ed2262e815f5b2;p=citadel.git diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index e718e3dde..9083fb8d4 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -1,7 +1,7 @@ /* * Citadel setup utility * - * Copyright (c) 1987-2019 by the citadel.org team + * Copyright (c) 1987-2021 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. @@ -48,10 +48,6 @@ #define _(string) (string) #endif -#define UI_TEXT 0 /* Default setup type -- text only */ -#define UI_DIALOG 2 /* Use the 'whiptail' or 'dialog' program */ -#define UI_SILENT 3 /* Silent running, for use in scripts */ - #define SERVICE_NAME "citadel" #define PROTO_NAME "tcp" #define NSSCONF "/etc/nsswitch.conf" @@ -112,7 +108,6 @@ void SetTitles(void) #ifdef ENABLE_NLS setlocale(LC_MESSAGES, getenv("LANG")); - bindtextdomain("citadel-setup", LOCALEDIR"/locale"); textdomain("citadel-setup"); bind_textdomain_codeset("citadel-setup","UTF8"); @@ -133,7 +128,6 @@ void SetTitles(void) "specify the -h flag to the server when you start it up.\n" "note that it may not have a leading /"); - setup_titles[eSysAdminName] = _("Citadel administrator username:"); setup_text[eSysAdminName] = _( "Please enter the name of the Citadel user account that should be granted " @@ -141,7 +135,6 @@ void SetTitles(void) "this user account will be created if it does not exist. For external " "authentication this user account has to exist."); - setup_titles[eSysAdminPW] = _("Administrator password:"); setup_text[eSysAdminPW] = _( "Enter a password for the system administrator. When setup\n" @@ -236,105 +229,52 @@ void SetTitles(void) } - -void title(const char *text) -{ - if (setup_type == UI_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); - } +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); } - -int yesno(const char *question, int default_value) -{ - int i = 0; +int yesno(const char *question, int default_value) { int answer = 0; char buf[SIZ]; - switch (setup_type) { - - case UI_TEXT: - do { - printf("%s\n%s [%s] --> ", - 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)) { - answer = default_value; - } - else if (answer == 'y') { - answer = 1; - } - else if (answer == 'n') { - answer = 0; - } + do { + printf("%s\n%s [%s] --> ", 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)) { + answer = default_value; + } + else if (answer == 'y') { + answer = 1; + } + else if (answer == 'n') { + answer = 0; } - } while ((answer < 0) || (answer > 1)); - break; - - case UI_DIALOG: - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' %s --yesno '%s' 15 75", - getenv("CTDL_DIALOG"), - program_title, - ( default_value ? "" : "--defaultno" ), - question); - i = system(buf); - if (i == 0) { - answer = 1; - } - else { - answer = 0; } - break; - case UI_SILENT: - break; - } + } while ((answer < 0) || (answer > 1)); return (answer); } -void important_message(const char *title, const char *msgtext) -{ +void important_message(const char *title, const char *msgtext) { char buf[SIZ]; - switch (setup_type) { - - 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("%s", _("Press return to continue...")); - if (fgets(buf, sizeof buf, stdin)) - {;} - break; - - case UI_DIALOG: - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --msgbox '%s' 19 72", - getenv("CTDL_DIALOG"), - program_title, - msgtext); - int rv = system(buf); - if (rv != 0) { - fprintf(stderr, _("failed to run the dialog command\n")); - } - break; - case UI_SILENT: - fprintf(stderr, "%s\n", msgtext); - break; + 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("%s", _("Press return to continue...")); + if (fgets(buf, sizeof buf, stdin)) { + ; } } -void important_msgnum(int msgnum) -{ + +void important_msgnum(int msgnum) { important_message(_("Important Message"), setup_text[msgnum]); } -void display_error(char *error_message_format, ...) -{ + +void display_error(char *error_message_format, ...) { StrBuf *Msg; va_list arg_ptr; @@ -347,79 +287,38 @@ void display_error(char *error_message_format, ...) FreeStrBuf(&Msg); } -void progress(char *text, long int curr, long int cmax) -{ + +void progress(char *text, long int curr, long int cmax) { static long dots_printed = 0L; long a = 0; - static FILE *fp = NULL; - char buf[SIZ]; - switch (setup_type) { - - case UI_TEXT: - if (curr == 0) { - printf("%s\n", text); - printf("...................................................."); - printf("..........................\r"); - dots_printed = 0; - } else if (curr == cmax) { - printf("\r%79s\n", ""); - } else { - a = (curr * 100) / cmax; - a = a * 78; - a = a / 100; - while (dots_printed < a) { - printf("*"); - ++dots_printed; - } - } - fflush(stdout); - break; - - case UI_DIALOG: - if (curr == 0) { - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --gauge '%s' 7 72 0", - getenv("CTDL_DIALOG"), - program_title, - text); - fp = popen(buf, "w"); - if (fp != NULL) { - fprintf(fp, "0\n"); - fflush(fp); - } - } - else if (curr == cmax) { - if (fp != NULL) { - fprintf(fp, "100\n"); - pclose(fp); - fp = NULL; - } - } - else { - a = (curr * 100) / cmax; - if (fp != NULL) { - fprintf(fp, "%ld\n", a); - fflush(fp); - } + if (curr == 0) { + printf("%s\n", text); + printf("...................................................."); + printf("..........................\r"); + dots_printed = 0; + } else if (curr == cmax) { + printf("\r%79s\n", ""); + } else { + a = (curr * 100) / cmax; + a = a * 78; + a = a / 100; + while (dots_printed < a) { + printf("*"); + ++dots_printed; } - break; - case UI_SILENT: - break; - - default: - assert(1==0); /* If we got here then the developer is a moron */ } + fflush(stdout); } -int uds_connectsock(char *sockpath) -{ +int uds_connectsock(char *sockpath) { int s; struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, sockpath, sizeof addr.sun_path); + strcpy(addr.sun_path, sockpath); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { @@ -438,8 +337,7 @@ int uds_connectsock(char *sockpath) /* * input binary data from socket */ -void serv_read(char *buf, int bytes) -{ +void serv_read(char *buf, int bytes) { int len, rlen; len = 0; @@ -456,8 +354,7 @@ void serv_read(char *buf, int bytes) /* * send binary to server */ -void serv_write(char *buf, int nbytes) -{ +void serv_write(char *buf, int nbytes) { int bytes_written = 0; int retval; while (bytes_written < nbytes) { @@ -470,12 +367,10 @@ void serv_write(char *buf, int nbytes) } - /* * input string from socket - implemented in terms of serv_read() */ -void serv_gets(char *buf) -{ +void serv_gets(char *buf) { int i; /* Read one character at a time. @@ -503,8 +398,7 @@ void serv_gets(char *buf) /* * send line to server - implemented in terms of serv_write() */ -void serv_puts(char *buf) -{ +void serv_puts(char *buf) { serv_write(buf, strlen(buf)); serv_write("\n", 1); } @@ -513,8 +407,7 @@ void serv_puts(char *buf) /* * Convenience functions to get/set system configuration entries */ -void getconf_str(char *buf, char *key) -{ +void getconf_str(char *buf, char *key) { char cmd[SIZ]; char ret[SIZ]; @@ -529,15 +422,15 @@ void getconf_str(char *buf, char *key) } } -int getconf_int(char *key) -{ + +int getconf_int(char *key) { char buf[SIZ]; getconf_str(buf, key); return atoi(buf); } -void setconf_str(char *key, char *val) -{ + +void setconf_str(char *key, char *val) { char buf[SIZ]; sprintf(buf, "CONF PUTVAL|%s|%s", key, val); @@ -546,8 +439,7 @@ void setconf_str(char *key, char *val) } -void setconf_int(char *key, int val) -{ +void setconf_int(char *key, int val) { char buf[SIZ]; sprintf(buf, "CONF PUTVAL|%s|%d", key, val); @@ -556,9 +448,6 @@ void setconf_int(char *key, int val) } - - - /* * On systems which use xinetd, see if we can offer to install Citadel as * the default telnet target. @@ -618,7 +507,7 @@ void check_xinetd_entry(void) ); fclose(fp); - /* Now try to restart the service. This will not have the intended effect on Solaris, but who the hell uses Solaris anymore? */ + /* Now try to restart the service. This will not have the intended effect on Solaris, but who uses Solaris anymore? */ rv = system("systemctl restart xinetd >/dev/null 2>&1"); if (rv != 0) { rv = system("service xinetd restart >/dev/null 2>&1"); @@ -629,75 +518,32 @@ 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) { char buf[SIZ] = ""; char setupmsg[SIZ]; - char dialog_result[PATH_MAX]; - FILE *fp = NULL; - int rv; strcpy(setupmsg, ""); - switch (setup_type) { - case UI_TEXT: - title(prompt_title); - printf("\n%s\n", prompt_text); - 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; - } - if (!IsEmptyStr(buf)) - strcpy(Target, buf); - break; - - case UI_DIALOG: - CtdlMakeTempFileName(dialog_result, sizeof dialog_result); - snprintf(buf, sizeof buf, "exec %s --backtitle '%s' --nocancel --inputbox '%s' 19 72 '%s' 2>%s", - getenv("CTDL_DIALOG"), - program_title, - prompt_text, - Target, - dialog_result); - rv = system(buf); - if (rv != 0) { - fprintf(stderr, "failed to run whiptail or dialog\n"); - } - - fp = fopen(dialog_result, "r"); - if (fp != NULL) { - if (fgets(Target, sizeof buf, fp)) { - if (Target[strlen(Target)-1] == 10) { - Target[strlen(Target)-1] = 0; - } - } - fclose(fp); - unlink(dialog_result); - } - break; - case UI_SILENT: - if (*DefValue != '\0') - strcpy(Target, DefValue); - break; + title(prompt_title); + printf("\n%s\n", prompt_text); + 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; + } + if (!IsEmptyStr(buf)) { + strcpy(Target, buf); } } -void set_bool_val(int msgpos, int *ip, char *DefValue) -{ + +void set_bool_val(int msgpos, int *ip, char *DefValue) { title(setup_titles[msgpos]); *ip = yesno(setup_text[msgpos], *ip); } + void set_str_val(int msgpos, char *Target, char *DefValue) { strprompt(setup_titles[msgpos], @@ -707,6 +553,7 @@ 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) { @@ -730,10 +577,6 @@ void edit_value(int curr) int auth = 0; int lportnum = 0; - if (setup_type == UI_SILENT) - { - default_value = getenv(EnvNames[curr]); - } if (default_value == NULL) { default_value = ""; } @@ -752,30 +595,20 @@ void edit_value(int curr) case eUID: ctdluid = getconf_int("c_ctdluid"); - if (setup_type == UI_SILENT) - { - if (default_value) { - ctdluid = atoi(default_value); - } + pw = getpwuid(ctdluid); + if (pw == NULL) { + set_int_val(curr, &ctdluid, default_value); } - else - { - pw = getpwuid(ctdluid); - if (pw == NULL) { - set_int_val(curr, &ctdluid, default_value); + else { + strcpy(ctdluidname, pw->pw_name); + set_str_val(curr, ctdluidname, default_value); + pw = getpwnam(ctdluidname); + if (pw != NULL) { + ctdluid = pw->pw_uid; } - else { - strcpy(ctdluidname, pw->pw_name); - set_str_val(curr, ctdluidname, default_value); - pw = getpwnam(ctdluidname); - if (pw != NULL) { - ctdluid = pw->pw_uid; - } - else if (atoi(ctdluidname) > 0) { - ctdluid = atoi(ctdluidname); - } + else if (atoi(ctdluidname) > 0) { + ctdluid = atoi(ctdluidname); } -#endif } setconf_int("c_ctdluid", ctdluid); break; @@ -794,17 +627,7 @@ void edit_value(int curr) case eAuthType: auth = getconf_int("c_auth_mode"); - if (setup_type == UI_SILENT) - { - if ( (default_value) && (!strcasecmp(default_value, "yes")) ) auth = AUTHMODE_HOST; - if ( (default_value) && (!strcasecmp(default_value, "host")) ) auth = AUTHMODE_HOST; - if ( (default_value) && (!strcasecmp(default_value, "ldap")) ) auth = AUTHMODE_LDAP; - if ( (default_value) && (!strcasecmp(default_value, "ldap_ad")) ) auth = AUTHMODE_LDAP_AD; - if ( (default_value) && (!strcasecmp(default_value, "active directory")) ) auth = AUTHMODE_LDAP_AD; - } - else { - set_int_val(curr, &auth, default_value); - } + set_int_val(curr, &auth, default_value); setconf_int("c_auth_mode", auth); break; @@ -847,113 +670,6 @@ void edit_value(int curr) } - -/* - * Figure out what type of user interface we're going to use - */ -int discover_ui(void) -{ - - /* Use "whiptail" or "dialog" if we have it */ - if (getenv("CTDL_DIALOG") != NULL) { - return UI_DIALOG; - } - - return UI_TEXT; -} - - - -/* - * 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" - ) - ); - - 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. @@ -978,9 +694,6 @@ int main(int argc, char *argv[]) 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; @@ -999,38 +712,17 @@ int main(int argc, char *argv[]) strcpy(aaa, &aaa[2]); setup_type = atoi(aaa); } - else if (!strcmp(argv[a], "-q")) { - setup_type = UI_SILENT; - } 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(); - - /* If a setup type was not specified, try to determine automatically - * the best one to use out of all available types. - */ - if (setup_type < 0) { - setup_type = discover_ui(); } - 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. @@ -1083,18 +775,7 @@ int main(int argc, char *argv[]) ++a; } - /* - * Now begin. - */ - - - if (setup_type == UI_TEXT) { - printf("\n\n\n *** %s ***\n\n", program_title); - } - - if (setup_type == UI_DIALOG) { - system("clear 2>/dev/null"); - } + printf("\n\n\n *** %s ***\n\n", program_title); /* Go through a series of dialogs prompting for config info */ for (curr = 1; curr < eMaxQuestions; ++curr) { @@ -1170,11 +851,7 @@ int main(int argc, char *argv[]) } progress(activity, 5, 5); -#ifndef __CYGWIN__ 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 */ -#endif /* * Restart citserver @@ -1220,9 +897,7 @@ int main(int argc, char *argv[]) close(serv_sock); progress(activity, 51, 51); - if ( (original_start_time == new_start_time) - || (new_start_time <= 0) - ) { + if ((original_start_time == new_start_time) || (new_start_time <= 0)) { display_error("%s\n", _("Setup failed to restart Citadel server. Please restart it manually.")); exit(7); }