X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Futils%2Fsetup.c;h=a2839ca72d7a237dfa79d4d8f972d14d7a9ff941;hb=85a574e6cc97eef54ef6099a7edb9a5e01acc59e;hp=eec27947fe5e7e5338c3d3ca8d67919540d382a6;hpb=1d738ab06a5394f604de22f816b87efaa6f2563a;p=citadel.git diff --git a/citadel/utils/setup.c b/citadel/utils/setup.c index eec27947f..a2839ca72 100644 --- a/citadel/utils/setup.c +++ b/citadel/utils/setup.c @@ -1,16 +1,9 @@ -/* - * Citadel setup utility - * - * Copyright (c) 1987-2014 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-2024 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,13 +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" -#if HAVE_BACKTRACE -#include -#endif +#include "../server/sysdep.h" +#include "../server/citadel_dirs.h" #ifdef ENABLE_NLS #ifdef HAVE_XLOCALE_H @@ -51,10 +42,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" @@ -73,10 +60,10 @@ typedef enum _SetupStep { eLDAP_Bind_DN = 10, eLDAP_Bind_PW = 11, eMaxQuestions = 12 -} eSteupStep; +} eSetupStep; -///"CREATE_XINETD_ENTRY"; -/* Environment variables, don't translate! */ +// "CREATE_XINETD_ENTRY"; +// Environment variables, don't translate! const char *EnvNames [eMaxQuestions] = { "HOME_DIRECTORY", "SYSADMIN_NAME", @@ -93,20 +80,18 @@ const char *EnvNames [eMaxQuestions] = { }; int setup_type = (-1); -int using_web_installer = 0; int enable_home = 1; +char admin_name[SIZ]; char admin_pass[SIZ]; char admin_cmd[SIZ]; int serv_sock = (-1) ; -char configs[NUM_CONFIGS][1024]; const char *setup_titles[eMaxQuestions]; 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; @@ -116,7 +101,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"); @@ -137,7 +121,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 " @@ -145,7 +128,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" @@ -193,10 +175,10 @@ void SetTitles(void) "\n" " 0. Self contained authentication\n" " 1. Host system integrated authentication\n" -" 2. External LDAP - RFC 2307 compliant directory\n" -" 3. External LDAP - nonstandard MS Active Directory\n" +" 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"); @@ -224,143 +206,64 @@ 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 } -/* - * Print the stack frame for a backtrace - */ -void cit_backtrace(void) -{ -#ifdef HAVE_BACKTRACE - void *stack_frames[50]; - size_t size, i; - char **strings; - - size = backtrace(stack_frames, sizeof(stack_frames) / sizeof(void*)); - strings = backtrace_symbols(stack_frames, size); - for (i = 0; i < size; i++) { - if (strings != NULL) - fprintf(stderr, "%s\n", strings[i]); - else - fprintf(stderr, "%p\n", stack_frames[i]); - } - free(strings); -#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) -{ - 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) { + cls(); + printf("\033[1m\033[32m<\033[33m%s\033[32m>\033[0m\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("\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)) { + 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; + cls(); + printf("%s\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; @@ -373,80 +276,40 @@ void display_error(char *error_message_format, ...) FreeStrBuf(&Msg); } -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; +void progress(char *text, long int curr, long int cmax) { + long a = 0; + long i = 0; - 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) { + cls(); + printf("%s\n", text); + printf("\033[1m\033[33m[\033[32m............................................................................\033[33m]\033[0m\r"); + } + else if (curr == cmax) { + printf("\r%79s\n", ""); + } + else { + printf("\033[1m\033[33m[\033[32m"); + a = (curr * 100) / cmax; + a = a * 76; + a = a / 100; + for (i=0; i/dev/null 2>&1"); + // Now try to restart the service. (This only works on systemd; others will need to restart it manually.) + rv = system("systemctl restart xinetd >/dev/null 2>&1"); if (rv != 0) { - display_error(_("failed to restart xinetd.\n")); + rv = system("service xinetd restart >/dev/null 2>&1"); } -} - - - -/* - * Offer to disable other MTA's - */ -void disable_other_mta(const char *mta) { - char buf[SIZ]; - FILE *fp; - int lines = 0; - int rv; - - snprintf(buf, sizeof buf, - "/bin/ls -l /etc/rc*.d/S*%s 2>/dev/null; " - "/bin/ls -l /etc/rc.d/rc*.d/S*%s 2>/dev/null", - mta, mta - ); - fp = popen(buf, "r"); - if (fp == NULL) return; - - while (fgets(buf, sizeof buf, fp) != NULL) { - ++lines; - } - fclose(fp); - if (lines == 0) return; /* Nothing to do. */ - - /* Offer to replace other MTA with the vastly superior Citadel :) */ - - snprintf(buf, sizeof buf, - "%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; + if (rv != 0) { + display_error(_("failed to restart xinetd.\n")); } - - - snprintf(buf, sizeof 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); - - snprintf(buf, sizeof 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[] = { - "courier-authdaemon", - "courier-imap", - "courier-imap-ssl", - "courier-pop", - "courier-pop3", - "courier-pop3d", - "cyrmaster", - "cyrus", - "dovecot", - "exim", - "exim4", - "imapd", - "mta", - "pop3d", - "popd", - "postfix", - "qmail", - "saslauthd", - "sendmail", - "vmailmgrd", - "" -}; -void disable_other_mtas(void) -{ - int i = 0; - 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. */ - while (!IsEmptyStr(other_mtas[i])) - { - disable_other_mta(other_mtas[i]); - i++; - } - } -} - -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]; - 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) -{ + +void set_str_val(int msgpos, char *Target, char *DefValue) { strprompt(setup_titles[msgpos], setup_text[msgpos], Target, @@ -770,388 +526,184 @@ void set_str_val(int msgpos, char *Target, char *DefValue) ); } -/* like set_str_val() but make sure we ended up with a numeric value */ -void set_int_val(int msgpos, char *target, char *DefValue) -{ - while(1) { - set_str_val(msgpos, target, DefValue); - if (!strcmp(target, "0")) return; - if (atoi(target) != 0) return; - } + +// 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 { + set_str_val(msgpos, buf, default_value); + } while ( (strcmp(buf, "0")) && (atoi(buf) == 0) ); + *target = atoi(buf); } -void edit_value(int curr) -{ - int i; - struct passwd *pw; +void edit_value(int curr) { + struct passwd *pw = NULL; char ctdluidname[256]; - char *Value = NULL; + char buf[SIZ]; + char *default_value = NULL; + int ctdluid = 0; + int portnum = 0; + int auth = 0; + int lportnum = 0; - if (setup_type == UI_SILENT) - { - Value = getenv(EnvNames[curr]); - } - if (Value == NULL) { - Value = ""; + if (default_value == NULL) { + default_value = ""; } switch (curr) { case eSysAdminName: - set_str_val(curr, configs[13], Value); + getconf_str(admin_name, "c_sysadm"); + set_str_val(curr, admin_name, default_value); + setconf_str("c_sysadm", admin_name); break; case eSysAdminPW: - set_str_val(curr, admin_pass, Value); + set_str_val(curr, admin_pass, default_value); break; case eUID: - if (setup_type == UI_SILENT) - { - if (Value) { - sprintf(configs[69], "%d", atoi(Value)); - } + ctdluid = getconf_int("c_ctdluid"); + pw = getpwuid(ctdluid); + if (pw == NULL) { + set_int_val(curr, &ctdluid, default_value); } - else - { -#ifdef __CYGWIN__ - strcpy(configs[69], "0"); /* work-around for Windows */ -#else - i = atoi(configs[69]); - pw = getpwuid(i); - if (pw == NULL) { - set_int_val(curr, configs[69], Value); - sprintf(configs[69], "%d", i); + 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, Value); - pw = getpwnam(ctdluidname); - if (pw != NULL) { - sprintf(configs[69], "%d", pw->pw_uid); - } - else if (atoi(ctdluidname) > 0) { - sprintf(configs[69], "%d", atoi(ctdluidname)); - } + else if (atoi(ctdluidname) > 0) { + ctdluid = atoi(ctdluidname); } -#endif } + setconf_int("c_ctdluid", ctdluid); break; case eIP_ADDR: - set_str_val(curr, configs[37], Value); + getconf_str(buf, "c_ip_addr"); + set_str_val(curr, buf, default_value); + setconf_str("c_ip_addr", buf); break; case eCTDL_Port: - set_int_val(curr, configs[68], Value); + portnum = getconf_int("c_port_number"); + set_int_val(curr, &portnum, default_value); + setconf_int("c_port_number", portnum); break; case eAuthType: - if (setup_type == UI_SILENT) - { - const char *auth; - //config.c_auth_mode = AUTHMODE_NATIVE; - auth = Value; - if (auth != NULL) - { - if ((strcasecmp(auth, "yes") == 0) || - (strcasecmp(auth, "host") == 0)) - { - //config.c_auth_mode = AUTHMODE_HOST; - } - else if (strcasecmp(auth, "ldap") == 0){ - //config.c_auth_mode = AUTHMODE_LDAP; - } - else if ((strcasecmp(auth, "ldap_ad") == 0) || - (strcasecmp(auth, "active directory") == 0)){ - //config.c_auth_mode = AUTHMODE_LDAP_AD; - } - } - } - else { - set_int_val(curr, configs[52], Value); - } + auth = getconf_int("c_auth_mode"); + set_int_val(curr, &auth, default_value); + setconf_int("c_auth_mode", auth); break; case eLDAP_Host: - if (IsEmptyStr(configs[32])) { - strcpy(configs[32], "localhost"); + getconf_str(buf, "c_ldap_host"); + if (IsEmptyStr(buf)) { + strcpy(buf, "localhost"); } - set_str_val(curr, configs[32], Value); + set_str_val(curr, buf, default_value); + setconf_str("c_ldap_host", buf); break; case eLDAP_Port: - if (atoi(configs[33]) == 0) { - strcpy(configs[33], "389"); + lportnum = getconf_int("c_ldap_port"); + if (lportnum == 0) { + lportnum = 389; } - set_int_val(curr, configs[33], Value); + set_int_val(curr, &lportnum, default_value); + setconf_int("c_ldap_port", lportnum); break; case eLDAP_Base_DN: - set_str_val(curr, configs[34], Value); + getconf_str(buf, "c_ldap_base_dn"); + set_str_val(curr, buf, default_value); + setconf_str("c_ldap_base_dn", buf); break; case eLDAP_Bind_DN: - set_str_val(curr, configs[35], Value); + getconf_str(buf, "c_ldap_bind_dn"); + set_str_val(curr, buf, default_value); + setconf_str("c_ldap_bind_dn", buf); break; case eLDAP_Bind_PW: - set_str_val(curr, configs[36], Value); + getconf_str(buf, "c_ldap_bind_pw"); + set_str_val(curr, buf, default_value); + setconf_str("c_ldap_bind_pw", buf); break; - } } - -/* - * 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" - ) +// 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); -} - - - -#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 - - - -#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); - } } - -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { int a, i; int curr; char buf[1024]; char aaa[128]; - int info_only = 0; - int relh = 0; - int home = 0; - int nRetries = 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); - /* Check to see if we're running the web installer */ - if (getenv("CITADEL_INSTALLER") != NULL) { - using_web_installer = 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]); strcpy(aaa, &aaa[2]); setup_type = atoi(aaa); } - else if (!strcmp(argv[a], "-i")) { - info_only = 1; - } - 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(); - } - if (info_only == 1) { - important_message(_("Citadel Setup"), CITADEL); - exit(0); - } - - 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. - */ - while ((serv_sock < 0) && (nRetries < 10)) { + // 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 + progress(connectingmsg, i, 30); serv_sock = uds_connectsock(file_citadel_admin_socket); - nRetries ++; - if (serv_sock < 0) - sleep(1); + sleep(1); } + progress(connectingmsg, 30, 30); + if (serv_sock < 0) { display_error( "%s: %s %s\n", @@ -1161,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') { @@ -1183,62 +731,29 @@ 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); } } ++a; } - /* - * Load the server's configuration - */ - serv_puts("CONF GET"); - serv_gets(buf); - if (buf[0] != '1') { - display_error("%s\n", buf); - exit(5); - } - memset(configs, 0, sizeof configs); - a = 0; - while (serv_gets(buf), strcmp(buf, "000")) { - if (a < NUM_CONFIGS) { - safestrncpy(configs[a], buf, sizeof(configs[a])); - } - ++a; - } - - /* - * Now begin. - */ + printf("\n\n\n *** %s ***\n\n", program_title); - /* _("Citadel Setup"), */ - - if (setup_type == UI_TEXT) { - printf("\n\n\n *** %s ***\n\n", program_title); - } - - if (setup_type == UI_DIALOG) { - system("clear 2>/dev/null"); - } - - /* 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); - if ( (curr == 6) - && (atoi(configs[52]) != AUTHMODE_LDAP) - && (atoi(configs[52]) != AUTHMODE_LDAP_AD) + if ( (curr == eAuthType) + && (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 (atoi(configs[52]) == AUTHMODE_NATIVE) { - /* for native auth mode, fetch the admin's existing pw */ - snprintf(buf, sizeof buf, "AGUP %s", configs[13]); + 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); if (buf[0] == '2') { @@ -1246,90 +761,69 @@ 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(atoi(configs[69]))) == NULL) { + if ((pw = getpwuid( getconf_int("c_ctdluid") )) == NULL) { gid = getgid(); - } else { + } + else { gid = pw->pw_gid; } - if (create_run_directories(atoi(configs[69]), 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, NUM_CONFIGS+3); - sleep(1); /* Let the message appear briefly */ - serv_puts("CONF SET"); - serv_gets(buf); - if (buf[0] == '4') { - for (i=0; i