]> code.citadel.org Git - citadel.git/blobdiff - citadel/setup.c
* Backed out r7276 through r7278. This is too large a change to make during a featur...
[citadel.git] / citadel / setup.c
index e21bdcce082423866acb098c3a1017c2f971a643..05e6eacb1cad17aa975cccdf7034a16e57a6feb7 100644 (file)
 #include "sysdep.h"
 #include "config.h"
 #include "citadel_dirs.h"
 #include "sysdep.h"
 #include "config.h"
 #include "citadel_dirs.h"
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+
 
 
-#define MAXSETUP 5     /* How many setup questions to ask */
+#define MAXSETUP 6     /* How many setup questions to ask */
 
 #define UI_TEXT                0       /* Default setup type -- text only */
 #define UI_DIALOG      2       /* Use the 'dialog' program */
 
 #define UI_TEXT                0       /* Default setup type -- text only */
 #define UI_DIALOG      2       /* Use the 'dialog' program */
@@ -42,17 +46,42 @@ int setup_type;
 char setup_directory[PATH_MAX];
 int using_web_installer = 0;
 int enable_home = 1;
 char setup_directory[PATH_MAX];
 int using_web_installer = 0;
 int enable_home = 1;
+char admin_pass[SIZ];
+char admin_cmd[SIZ];
 
 char *setup_titles[] =
 {
        "Citadel Home Directory",
        "System Administrator",
 
 char *setup_titles[] =
 {
        "Citadel Home Directory",
        "System Administrator",
+       "Administrator Password",
        "Citadel User ID",
        "Server IP address",
        "Server port number",
        "Authentication mode"
 };
 
        "Citadel User ID",
        "Server IP address",
        "Server port number",
        "Authentication mode"
 };
 
+/**
+ * \brief print the actual stack frame.
+ */
+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
+}
 
 struct config config;
 
 
 struct config config;
 
@@ -78,6 +107,10 @@ char *setup_text[] = {
 "you).  When an account is created with this name, it will\n"
 "automatically be given administrator-level access.\n",
 
 "you).  When an account is created with this name, it will\n"
 "automatically be given administrator-level access.\n",
 
+"Enter a password for the system administrator. When setup\n"
+"completes it will attempt to create the administrator user\n"
+"and set the password specified here.\n",
+
 "Citadel needs to run under its own user ID.  This would\n"
 "typically be called \"citadel\", but if you are running Citadel\n"
 "as a public BBS, you might also call it \"bbs\" or \"guest\".\n"
 "Citadel needs to run under its own user ID.  This would\n"
 "typically be called \"citadel\", but if you are running Citadel\n"
 "as a public BBS, you might also call it \"bbs\" or \"guest\".\n"
@@ -115,6 +148,8 @@ int direction;
 
 void cleanup(int exitcode)
 {
 
 void cleanup(int exitcode)
 {
+//     printf("Exitcode: %d\n", exitcode);
+//     cit_backtrace();
        exit(exitcode);
 }
 
        exit(exitcode);
 }
 
@@ -167,6 +202,8 @@ int yesno(char *question, int default_value)
                        answer = 0;
                }
                break;
                        answer = 0;
                }
                break;
+       case UI_SILENT:
+               break;
 
        }
        return (answer);
 
        }
        return (answer);
@@ -192,6 +229,9 @@ void important_message(char *title, char *msgtext)
                        msgtext);
                system(buf);
                break;
                        msgtext);
                system(buf);
                break;
+       case UI_SILENT:
+               fprintf(stderr, "%s\n", msgtext);
+               break;
        }
 }
 
        }
 }
 
@@ -262,6 +302,8 @@ void progress(char *text, long int curr, long int cmax)
                        }
                }
                break;
                        }
                }
                break;
+       case UI_SILENT:
+               break;
 
        }
 }
 
        }
 }
@@ -446,9 +488,12 @@ void install_init_scripts(void)
                                setup_directory
                        );
        fprintf(fp,     "               ;;\n"
                                setup_directory
                        );
        fprintf(fp,     "               ;;\n"
-                       "restart)       $0 stop\n"
-                       "               $0 start\n"
-                       "               ;;\n"
+                       "restart)       if $CITADEL_DIR/sendcommand DOWN 1 >/dev/null 2>&1 ; then\n"
+                       "                       echo \"ok\"\n"
+                       "               else\n"
+                       "                       echo \"failed\"\n"
+                       "               fi\n"
+                       "               ;;\n"
                        "*)             echo \"Usage: $0 {start|stop|restart}\"\n"
                        "               exit 1\n"
                        "               ;;\n"
                        "*)             echo \"Usage: $0 {start|stop|restart}\"\n"
                        "               exit 1\n"
                        "               ;;\n"
@@ -554,26 +599,20 @@ void disable_other_mta(char *mta) {
 
        /* Offer to replace other MTA with the vastly superior Citadel :)  */
 
 
        /* Offer to replace other MTA with the vastly superior Citadel :)  */
 
-       if (getenv("ACT_AS_MTA")) {
-               if (strcasecmp(getenv("ACT_AS_MTA"), "yes")) {
-                       return;
-               }
-       }
-       else {
-               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
+       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
                );
                );
-               if (yesno(buf, 1) == 0) {
-                       return;
-               }
+       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);
        system(buf);
 
        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);
        system(buf);
@@ -587,7 +626,7 @@ void disable_other_mta(char *mta) {
 /* 
  * Check to see if our server really works.  Returns 0 on success.
  */
 /* 
  * Check to see if our server really works.  Returns 0 on success.
  */
-int test_server(void) {
+int test_server(char *setup_directory, char *relhomestr, int relhome) {
        char cmd[256];
        char cookie[256];
        FILE *fp;
        char cmd[256];
        char cookie[256];
        FILE *fp;
@@ -600,11 +639,15 @@ int test_server(void) {
         */
        sprintf(cookie, "--test--%d--", getpid());
 
         */
        sprintf(cookie, "--test--%d--", getpid());
 
-       sprintf(cmd, "%s/sendcommand %s%s ECHO %s 2>&1",
-               ctdl_sbin_dir,
-               (enable_home)?"-h":"", 
-               (enable_home)?ctdl_run_dir:"",
-               cookie);
+       if (relhome)
+               sprintf(cmd, "%s/sendcommand -h%s ECHO %s 2>&1",
+                       ctdl_sbin_dir,
+                       relhomestr,
+                       cookie);
+       else
+               sprintf(cmd, "%s/sendcommand ECHO %s 2>&1",
+                       ctdl_sbin_dir,
+                       cookie);
 
        fp = popen(cmd, "r");
        if (fp == NULL) return(errno);
 
        fp = popen(cmd, "r");
        if (fp == NULL) return(errno);
@@ -662,7 +705,8 @@ void strprompt(char *prompt_title, char *prompt_text, char *str)
                        unlink(dialog_result);
                }
                break;
                        unlink(dialog_result);
                }
                break;
-
+       case UI_SILENT:
+               break;
        }
 }
 
        }
 }
 
@@ -723,6 +767,18 @@ void edit_value(int curr)
                break;
 
        case 2:
                break;
 
        case 2:
+               if (setup_type == UI_SILENT)
+               {
+                       if (getenv("SYSADMIN_PW")) {
+                               strcpy(admin_pass, getenv("SYSADMIN_PW"));
+                       }
+               }
+               else {
+                       set_str_val(curr, admin_pass);
+               }
+               break;
+       
+       case 3:
                if (setup_type == UI_SILENT)
                {               
                        if (getenv("CITADEL_UID")) {
                if (setup_type == UI_SILENT)
                {               
                        if (getenv("CITADEL_UID")) {
@@ -755,7 +811,7 @@ void edit_value(int curr)
                }
                break;
 
                }
                break;
 
-       case 3:
+       case 4:
                if (setup_type == UI_SILENT)
                {
                        if (getenv("IP_ADDR")) {
                if (setup_type == UI_SILENT)
                {
                        if (getenv("IP_ADDR")) {
@@ -767,7 +823,7 @@ void edit_value(int curr)
                }
                break;
 
                }
                break;
 
-       case 4:
+       case 5:
                if (setup_type == UI_SILENT)
                {
                        if (getenv("CITADEL_PORT")) {
                if (setup_type == UI_SILENT)
                {
                        if (getenv("CITADEL_PORT")) {
@@ -780,15 +836,15 @@ void edit_value(int curr)
                }
                break;
 
                }
                break;
 
-       case 5:
+       case 6:
                if (setup_type == UI_SILENT)
                {
                        if (getenv("ENABLE_UNIX_AUTH")) {
                                if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
                if (setup_type == UI_SILENT)
                {
                        if (getenv("ENABLE_UNIX_AUTH")) {
                                if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
-                                       config.c_auth_mode = 1;
+                                       config.c_auth_mode = AUTHMODE_HOST;
                                }
                                else {
                                }
                                else {
-                                       config.c_auth_mode = 0;
+                                       config.c_auth_mode = AUTHMODE_NATIVE;
                                }
                        }
                }
                                }
                        }
                }
@@ -921,6 +977,7 @@ void fixnss(void) {
        if (yesno(question, 1)) {
                sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
                system(buf);
        if (yesno(question, 1)) {
                sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
                system(buf);
+               chmod(NSSCONF, 0644);
        }
        unlink(new_filename);
 }
        }
        unlink(new_filename);
 }
@@ -949,8 +1006,6 @@ int main(int argc, char *argv[])
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
        
        char relhome[PATH_MAX]="";
        char ctdldir[PATH_MAX]=CTDLDIR;
        
-       CtdlInitBase64Table();
-
        /* set an invalid setup type */
        setup_type = (-1);
 
        /* set an invalid setup type */
        setup_type = (-1);
 
@@ -966,14 +1021,25 @@ int main(int argc, char *argv[])
                        strcpy(aaa, &aaa[2]);
                        setup_type = atoi(aaa);
                }
                        strcpy(aaa, &aaa[2]);
                        setup_type = atoi(aaa);
                }
-               if (!strcmp(argv[a], "-i")) {
+               else if (!strcmp(argv[a], "-i")) {
                        info_only = 1;
                }
                        info_only = 1;
                }
-               if (!strcmp(argv[a], "-q")) {
+               else if (!strcmp(argv[a], "-q")) {
                        setup_type = UI_SILENT;
                }
                        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;
+               }
+
        }
 
        }
 
+       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
 
        /* If a setup type was not specified, try to determine automatically
         * the best one to use out of all available types.
 
        /* If a setup type was not specified, try to determine automatically
         * the best one to use out of all available types.
@@ -995,28 +1061,14 @@ int main(int argc, char *argv[])
                set_str_val(0, setup_directory);
        }
 
                set_str_val(0, setup_directory);
        }
 
-       home=(setup_directory[1]!='\0');
-       relh=home&(setup_directory[1]!='/');
-       if (!relh) {
-               safestrncpy(ctdl_home_directory, setup_directory, sizeof ctdl_home_directory);
-       }
-       else {
-               safestrncpy(relhome, ctdl_home_directory, sizeof relhome);
-       }
-
-       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
-       
-       enable_home=(relh|home);
+       enable_home = ( relh | home );
 
 
-       if (home) {
-               if (chdir(setup_directory) == 0) {
-                       strcpy(file_citadel_config, "./citadel.config");
-               }
-               else {
-                       important_message("Citadel Setup",
-                               "The directory you specified does not exist.");
-                       cleanup(errno);
-               }
+       if (chdir(setup_directory) != 0) {
+               char errmsg[SIZ];
+               sprintf(errmsg, "The directory you specified does not exist: [%s]\n", setup_directory);
+               
+               important_message("Citadel Setup", errmsg);
+               cleanup(errno);
        }
 
        /* Determine our host name, in case we need to use it as a default */
        }
 
        /* Determine our host name, in case we need to use it as a default */
@@ -1028,7 +1080,7 @@ int main(int argc, char *argv[])
        }
 
        /* Make sure Citadel is not running. */
        }
 
        /* Make sure Citadel is not running. */
-       if (test_server() == 0) {
+       if (test_server(setup_directory, relhome, enable_home) == 0) {
                important_message("Citadel Setup",
                        "The Citadel service is still running.\n"
                        "Please stop the service manually and run "
                important_message("Citadel Setup",
                        "The Citadel service is still running.\n"
                        "Please stop the service manually and run "
@@ -1235,32 +1287,38 @@ NEW_INST:
        unlink("citadel.log");
        unlink("weekly");
 
        unlink("citadel.log");
        unlink("weekly");
 
-       check_services_entry(); /* Check /etc/services */
+       if (((setup_type == UI_SILENT) && (getenv("ALTER_ETC_SERVICES")!=NULL)) || 
+           (setup_type != UI_SILENT))
+               check_services_entry(); /* Check /etc/services */
 #ifndef __CYGWIN__
        delete_inittab_entry(); /* Remove obsolete /etc/inittab entry */
        check_xinetd_entry();   /* Check /etc/xinetd.d/telnet */
 
 #ifndef __CYGWIN__
        delete_inittab_entry(); /* Remove obsolete /etc/inittab entry */
        check_xinetd_entry();   /* Check /etc/xinetd.d/telnet */
 
-       /* Offer to disable other MTA's on the system. */
-       disable_other_mta("courier-authdaemon");
-       disable_other_mta("courier-imap");
-       disable_other_mta("courier-imap-ssl");
-       disable_other_mta("courier-pop");
-       disable_other_mta("courier-pop3");
-       disable_other_mta("courier-pop3d");
-       disable_other_mta("cyrmaster");
-       disable_other_mta("cyrus");
-       disable_other_mta("dovecot");
-       disable_other_mta("exim");
-       disable_other_mta("exim4");
-       disable_other_mta("imapd");
-       disable_other_mta("mta");
-       disable_other_mta("pop3d");
-       disable_other_mta("popd");
-       disable_other_mta("postfix");
-       disable_other_mta("qmail");
-       disable_other_mta("saslauthd");
-       disable_other_mta("sendmail");
-       disable_other_mta("vmailmgrd");
+       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. */
+               disable_other_mta("courier-authdaemon");
+               disable_other_mta("courier-imap");
+               disable_other_mta("courier-imap-ssl");
+               disable_other_mta("courier-pop");
+               disable_other_mta("courier-pop3");
+               disable_other_mta("courier-pop3d");
+               disable_other_mta("cyrmaster");
+               disable_other_mta("cyrus");
+               disable_other_mta("dovecot");
+               disable_other_mta("exim");
+               disable_other_mta("exim4");
+               disable_other_mta("imapd");
+               disable_other_mta("mta");
+               disable_other_mta("pop3d");
+               disable_other_mta("popd");
+               disable_other_mta("postfix");
+               disable_other_mta("qmail");
+               disable_other_mta("saslauthd");
+               disable_other_mta("sendmail");
+               disable_other_mta("vmailmgrd");
+       }
 #endif
 
        /* Check for the 'db' nss and offer to disable it */
 #endif
 
        /* Check for the 'db' nss and offer to disable it */
@@ -1293,12 +1351,31 @@ NEW_INST:
                        sleep(3);
                }
 
                        sleep(3);
                }
 
-               if (test_server() == 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");
+               if (test_server(setup_directory, relhome, enable_home) == 0) {
+                       char buf[SIZ];
+                       int found_it = 0;
+
+                       snprintf (admin_cmd, sizeof(admin_cmd), "%s/sendcommand \"CREU %s|%s\" 2>&1", 
+                                 ctdl_sbin_dir, config.c_sysadm, admin_pass);
+                       fp = popen(admin_cmd, "r");
+                       if (fp != NULL) {
+                               while (fgets(buf, sizeof buf, fp) != NULL) 
+                               {
+                                       if ((atol(buf) == 574) || (atol(buf) == 200))
+                                               ++found_it;
+                               }
+                               pclose(fp);
+                       }
+               
+                       if (found_it == 0)
+                               important_message("Error","Setup failed to create your admin user");
+
+                       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");
                }
                else {
                        important_message("Setup failed",
                }
                else {
                        important_message("Setup failed",