]> code.citadel.org Git - citadel.git/blobdiff - citadel/setup.c
* setup.c: updated to use new built-in daemonization
[citadel.git] / citadel / setup.c
index 6f727a581da641c22baca294f12b0f7617767523..8ff9c297cae6fa6794dc710e7894b2082fc128b8 100644 (file)
 #include "tools.h"
 #include "citadel_dirs.h"
 
-#ifdef HAVE_NEWT
-#include <newt.h>
-#endif
-
-
-#define MAXSETUP 4     /* How many setup questions to ask */
+#define MAXSETUP 5     /* 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_SILENT      3       /* Silent running, for use in scripts */
-#define UI_NEWT                4       /* Use the "newt" window library */
 
 #define SERVICE_NAME   "citadel"
 #define PROTO_NAME     "tcp"
@@ -57,6 +51,7 @@ char *setup_titles[] =
        "Citadel User ID",
        "Server IP address",
        "Server port number",
+       "Authentication mode"
 };
 
 
@@ -103,6 +98,16 @@ char *setup_text[] = {
 "of Citadel on the same computer and there is something else\n"
 "already using port 504.\n",
 
+"Normally, a Citadel system uses a \"black box\" authentication mode.\n"
+"This means that users do not have accounts or home directories on\n"
+"the underlying host system -- Citadel manages its own user database.\n"
+"However, if you wish to override this behavior, you can enable the\n"
+"host based authentication mode which is traditional for Unix systems.\n"
+"WARNING: do *not* change this setting once your system is installed.\n"
+"\n"
+"(Answer \"no\" unless you completely understand this option)\n"
+"Do you want to enable host based authentication mode?\n"
+
 };
 
 struct config config;
@@ -111,11 +116,6 @@ int direction;
 
 void cleanup(int exitcode)
 {
-#ifdef HAVE_NEWT
-       newtCls();
-       newtRefresh();
-       newtFinished();
-#endif
        exit(exitcode);
 }
 
@@ -130,14 +130,8 @@ void title(char *text)
 
 
 
-int yesno(char *question)
+int yesno(char *question, int default_value)
 {
-#ifdef HAVE_NEWT
-       newtComponent form = NULL;
-       newtComponent yesbutton = NULL;
-       newtComponent nobutton = NULL;
-       int prompt_window_height = 0;
-#endif
        int i = 0;
        int answer = 0;
        char buf[SIZ];
@@ -146,10 +140,15 @@ int yesno(char *question)
 
        case UI_TEXT:
                do {
-                       printf("%s\nYes/No --> ", question);
+                       printf("%s\nYes/No [%s] --> ",
+                               question,
+                               ( default_value ? "Yes" : "No" )
+                       );
                        fgets(buf, sizeof buf, stdin);
                        answer = tolower(buf[0]);
-                       if (answer == 'y')
+                       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;
@@ -157,8 +156,9 @@ int yesno(char *question)
                break;
 
        case UI_DIALOG:
-               sprintf(buf, "exec %s --yesno '%s' 10 72",
+               sprintf(buf, "exec %s %s --yesno '%s' 15 75",
                        getenv("CTDL_DIALOG"),
+                       ( default_value ? "" : "--defaultno" ),
                        question);
                i = system(buf);
                if (i == 0) {
@@ -169,31 +169,6 @@ int yesno(char *question)
                }
                break;
 
-#ifdef HAVE_NEWT
-       case UI_NEWT:
-               prompt_window_height = num_tokens(question, '\n') + 5;
-               newtCenteredWindow(76, prompt_window_height, "Question");
-               form = newtForm(NULL, NULL, 0);
-               for (i=0; i<num_tokens(question, '\n'); ++i) {
-                       extract_token(buf, question, i, '\n', sizeof buf);
-                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
-               }
-               yesbutton = newtButton(10, (prompt_window_height - 4), "Yes");
-               nobutton = newtButton(60, (prompt_window_height - 4), "No");
-               newtFormAddComponent(form, yesbutton);
-               newtFormAddComponent(form, nobutton);
-               if (newtRunForm(form) == yesbutton) {
-                       answer = 1;
-               }
-               else {
-                       answer = 0;
-               }
-               newtPopWindow();
-               newtFormDestroy(form);  
-
-               break;
-#endif
-
        }
        return (answer);
 }
@@ -201,10 +176,6 @@ int yesno(char *question)
 
 void important_message(char *title, char *msgtext)
 {
-#ifdef HAVE_NEWT
-       newtComponent form = NULL;
-       int i = 0;
-#endif
        char buf[SIZ];
 
        switch (setup_type) {
@@ -222,22 +193,6 @@ void important_message(char *title, char *msgtext)
                        msgtext);
                system(buf);
                break;
-
-#ifdef HAVE_NEWT
-       case UI_NEWT:
-               newtCenteredWindow(76, 10, title);
-               form = newtForm(NULL, NULL, 0);
-               for (i=0; i<num_tokens(msgtext, '\n'); ++i) {
-                       extract_token(buf, msgtext, i, '\n', sizeof buf);
-                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
-               }
-               newtFormAddComponent(form, newtButton(35, 5, "OK"));
-               newtRunForm(form);
-               newtPopWindow();
-               newtFormDestroy(form);  
-               break;
-#endif
-
        }
 }
 
@@ -253,16 +208,6 @@ void display_error(char *error_message)
 
 void progress(char *text, long int curr, long int cmax)
 {
-#ifdef HAVE_NEWT
-
-       /* These variables are static because progress() gets called
-        * multiple times during the course of whatever operation is
-        * being performed.  This makes setup non-threadsafe, but who
-        * cares?
-        */
-       static newtComponent form = NULL;
-       static newtComponent scale = NULL;
-#endif
        static long dots_printed = 0L;
        long a = 0;
        static FILE *fp = NULL;
@@ -319,28 +264,6 @@ void progress(char *text, long int curr, long int cmax)
                }
                break;
 
-#ifdef HAVE_NEWT
-       case UI_NEWT:
-               if (curr == 0) {
-                       newtCenteredWindow(76, 8, text);
-                       form = newtForm(NULL, NULL, 0);
-                       scale = newtScale(1, 3, 74, cmax);
-                       newtFormAddComponent(form, scale);
-                       newtDrawForm(form);
-                       newtRefresh();
-               }
-               if ((curr > 0) && (curr <= cmax)) {
-                       newtScaleSet(scale, curr);
-                       newtRefresh();
-               }
-               if (curr == cmax) {
-                       newtFormDestroy(form);  
-                       newtPopWindow();
-                       newtRefresh();
-               }
-               break;
-#endif
-
        }
 }
 
@@ -404,6 +327,16 @@ void delete_inittab_entry(void)
        /* Now tweak /etc/inittab */
        infp = fopen("/etc/inittab", "r");
        if (infp == NULL) {
+
+               /* If /etc/inittab does not exist, return quietly.
+                * Not all host platforms have it.
+                */
+               if (errno == ENOENT) {
+                       return;
+               }
+
+               /* Other errors might mean something really did go wrong.
+                */
                sprintf(buf, "Cannot open /etc/inittab: %s", strerror(errno));
                display_error(buf);
                return;
@@ -448,7 +381,7 @@ void install_init_scripts(void)
 {
        FILE *fp;
 
-       if (yesno("Would you like to automatically start Citadel at boot?\n") == 0) {
+       if (yesno("Would you like to automatically start Citadel at boot?\n", 1) == 0) {
                return;
        }
 
@@ -459,8 +392,19 @@ void install_init_scripts(void)
        }
 
        fprintf(fp,     "#!/bin/sh\n"
+                       "#\n"
+                       "# Init file for Citadel\n"
+                       "#\n"
+                       "# chkconfig: - 79 30\n"
+                       "# description: Citadel service\n"
+                       "# processname: citserver\n"
+                       "# pidfile: %s/citadel.pid\n"
                        "\n"
-                       "CITADEL_DIR=%s\n", setup_directory);
+                       "CITADEL_DIR=%s\n"
+                       ,
+                               setup_directory,
+                               setup_directory
+                       );
        fprintf(fp,     "\n"
                        "test -x $CITADEL_DIR/ctdlsvc || exit 0\n"
                        "test -d /var/run || exit 0\n"
@@ -468,9 +412,7 @@ void install_init_scripts(void)
                        "case \"$1\" in\n"
                        "\n"
                        "start)         echo -n \"Starting Citadel... \"\n"
-                       "               if $CITADEL_DIR/ctdlsvc /var/run/citadel.pid "
-                                                       "$CITADEL_DIR/citserver "
-                                                       "-t/dev/null\n"
+                       "               if $CITADEL_DIR/citserver -d\n"
                        "               then\n"
                        "                       echo \"ok\"\n"
                        "               else\n"
@@ -483,7 +425,10 @@ void install_init_scripts(void)
                        "               else\n"
                        "                       echo \"failed\"\n"
                        "               fi\n"
-                       "               rm -f /var/run/citadel.pid 2>/dev/null\n");
+                       "               rm -f %s/citadel.pid 2>/dev/null\n"
+                       ,
+                               setup_directory
+                       );
        fprintf(fp,     "               ;;\n"
                        "restart)       $0 stop\n"
                        "               $0 start\n"
@@ -540,7 +485,7 @@ void check_xinetd_entry(void) {
                        "connect incoming telnet sessions to Citadel, bypassing the\n"
                        "host system login: prompt.  Would you like to do this?\n"
                );
-               if (yesno(buf) == 0) {
+               if (yesno(buf, 1) == 0) {
                        return;
                }
        }
@@ -612,7 +557,7 @@ void disable_other_mta(char *mta) {
                        "25, 110, and 143?\n",
                        mta, mta, mta, mta
                );
-               if (yesno(buf) == 0) {
+               if (yesno(buf, 1) == 0) {
                        return;
                }
        }
@@ -671,12 +616,6 @@ int test_server(void) {
 
 void strprompt(char *prompt_title, char *prompt_text, char *str)
 {
-#ifdef HAVE_NEWT
-       newtComponent form;
-       char *result;
-       int i;
-       int prompt_window_height = 0;
-#endif
        char buf[SIZ];
        char setupmsg[SIZ];
        char dialog_result[PATH_MAX];
@@ -715,42 +654,18 @@ void strprompt(char *prompt_title, char *prompt_text, char *str)
                }
                break;
 
-#ifdef HAVE_NEWT
-       case UI_NEWT:
-
-               prompt_window_height = num_tokens(prompt_text, '\n') + 5 ;
-               newtCenteredWindow(76,
-                               prompt_window_height,
-                               prompt_title);
-               form = newtForm(NULL, NULL, 0);
-               for (i=0; i<num_tokens(prompt_text, '\n'); ++i) {
-                       extract_token(buf, prompt_text, i, '\n', sizeof buf);
-                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
-               }
-               newtFormAddComponent(form,
-                       newtEntry(1,
-                               (prompt_window_height - 2),
-                               str,
-                               74,
-                               (const char **) &result,
-                               NEWT_FLAG_RETURNEXIT)
-               );
-               newtRunForm(form);
-               strcpy(str, result);
-
-               newtPopWindow();
-               newtFormDestroy(form);  
-
-#endif
        }
 }
 
+void set_bool_val(int msgpos, int *ip) {
+       title(setup_titles[msgpos]);
+       *ip = yesno(setup_text[msgpos], *ip);
+}
+
 void set_str_val(int msgpos, char *str) {
        strprompt(setup_titles[msgpos], setup_text[msgpos], str);
 }
 
-
-
 void set_int_val(int msgpos, int *ip)
 {
        char buf[16];
@@ -782,7 +697,7 @@ void edit_value(int curr)
 {
        int i;
        struct passwd *pw;
-       char ctdluidname[SIZ];
+       char ctdluidname[256];
 
        switch (curr) {
 
@@ -827,6 +742,19 @@ void edit_value(int curr)
                set_int_val(curr, &config.c_port_number);
                break;
 
+       case 5:
+               if (getenv("ENABLE_UNIX_AUTH")) {
+                       if (!strcasecmp(getenv("ENABLE_UNIX_AUTH"), "yes")) {
+                               config.c_auth_mode = 1;
+                       }
+                       else {
+                               config.c_auth_mode = 0;
+                       }
+               }
+               else {
+                       set_bool_val(curr, &config.c_auth_mode);
+               }
+               break;
 
        }
 }
@@ -866,13 +794,6 @@ int discover_ui(void)
                return UI_DIALOG;
        }
                
-
-#ifdef HAVE_NEWT
-       newtInit();
-       newtCls();
-       newtDrawRootText(0, 0, "Citadel Setup");
-       return UI_NEWT;
-#endif
        return UI_TEXT;
 }
 
@@ -956,7 +877,7 @@ void fixnss(void) {
                "\n"
        );
 
-       if (yesno(question)) {
+       if (yesno(question, 1)) {
                sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
                system(buf);
        }
@@ -1066,11 +987,7 @@ int main(int argc, char *argv[])
 
        /* Try to stop Citadel if we can */
        if (!access("/etc/init.d/citadel", X_OK)) {
-               for (a=0; a<=2; ++a) {
-                       progress("Stopping the Citadel service...", a, 2);
-                       if (a == 0) system("/etc/init.d/citadel stop >/dev/null 2>&1");
-                       sleep(1);
-               }
+               system("/etc/init.d/citadel stop");
        }
 
        /* Make sure Citadel is not running. */
@@ -1356,11 +1273,8 @@ NEW_INST:
                }
 
                if (!access("/etc/init.d/citadel", X_OK)) {
-                       for (a=0; a<=2; ++a) {
-                               progress("Starting the Citadel service...", a, 2);
-                               if (a == 0) system("/etc/init.d/citadel start </dev/null >/dev/null 2>&1");
-                               sleep(1);
-                       }
+                       system("/etc/init.d/citadel start");
+                       sleep(3);
                }
 
                if (test_server() == 0) {