Remove erroneous extra parameter from display_error() call in setup.c (submitted...
[citadel.git] / citadel / utils / setup.c
index 5eb2ae9d00016884b5b3233cc3e636e3e506a5ea..bb7f542dec09c2fe53248fba5d6f65df9b64386d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Citadel setup utility
  *
- * Copyright (c) 1987-2012 by the citadel.org team
+ * 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.
@@ -21,7 +21,6 @@
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/utsname.h>
 #include <sys/wait.h>
 #include <signal.h>
 #include <netdb.h>
@@ -104,6 +103,7 @@ char configs[NUM_CONFIGS][1024];
 const char *setup_titles[eMaxQuestions];
 const char *setup_text[eMaxQuestions];
 
+char *program_title;
 
 void SetTitles(void)
 {
@@ -261,8 +261,6 @@ void cit_backtrace(void)
 #endif
 }
 
-int direction;
-
 
 
 void title(const char *text)
@@ -306,8 +304,9 @@ int yesno(const char *question, int default_value)
                break;
 
        case UI_DIALOG:
-               sprintf(buf, "exec %s %s --yesno '%s' 15 75",
+               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);
@@ -335,12 +334,14 @@ void important_message(const char *title, const char *msgtext)
                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));
+               if (fgets(buf, sizeof buf, stdin))
+                       ;
                break;
 
        case UI_DIALOG:
-               sprintf(buf, "exec %s --msgbox '%s' 19 72",
+               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) {
@@ -403,8 +404,9 @@ void progress(char *text, long int curr, long int cmax)
 
        case UI_DIALOG:
                if (curr == 0) {
-                       sprintf(buf, "exec %s --gauge '%s' 7 72 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) {
@@ -610,7 +612,7 @@ void disable_other_mta(const char *mta) {
        int lines = 0;
        int rv;
 
-       sprintf(buf,
+       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
@@ -649,12 +651,12 @@ void disable_other_mta(const char *mta) {
        }
        
 
-       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);
+       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);
 
-       sprintf(buf, "/etc/init.d/%s stop >/dev/null 2>&1", 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);
@@ -724,8 +726,9 @@ void strprompt(const char *prompt_title, const char *prompt_text, char *Target,
 
        case UI_DIALOG:
                CtdlMakeTempFileName(dialog_result, sizeof dialog_result);
-               sprintf(buf, "exec %s --nocancel --inputbox '%s' 19 72 '%s' 2>%s",
+               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);
@@ -995,7 +998,7 @@ void fixnss(void) {
        );
 
        if (yesno(question, 1)) {
-               sprintf(buf, "/bin/mv -f %s %s", new_filename, NSSCONF);
+               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);
@@ -1144,6 +1147,8 @@ void set_default_values(void)
        GetDefaultVALINT(c_managesieve_port, 2020);
        GetDefaultVALINT(c_xmpp_c2s_port, 5222);
        GetDefaultVALINT(c_xmpp_s2s_port, 5269);
+       GetDefaultVALINT(c_nntp_port, 119);
+       GetDefaultVALINT(c_nntps_port, 563);
 #endif
 }
 
@@ -1156,14 +1161,18 @@ int main(int argc, char *argv[])
        char buf[1024]; 
        char aaa[128];
        int info_only = 0;
-       int relh=0;
-       int home=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");
+
        /* set an invalid setup type */
        setup_type = (-1);
 
@@ -1214,8 +1223,7 @@ int main(int argc, char *argv[])
        enable_home = ( relh | home );
 
        if (chdir(ctdl_run_dir) != 0) {
-               display_error(_("Citadel Setup"), 
-                             "%s: [%s]\n", 
+               display_error("%s: [%s]\n", 
                              _("The directory you specified does not exist"), 
                              ctdl_run_dir);
                exit(errno);
@@ -1225,11 +1233,17 @@ int main(int argc, char *argv[])
        /*
         * Connect to the running Citadel server.
         */
-        serv_sock = uds_connectsock(file_citadel_admin_socket);
+       while ((serv_sock < 0) && (nRetries < 10)) {
+               serv_sock = uds_connectsock(file_citadel_admin_socket);
+               nRetries ++;
+               if (serv_sock < 0)
+                       sleep(1);
+       }
        if (serv_sock < 0) { 
                display_error(
-                       "%s\n", 
-                       _("Setup could not connect to a running Citadel server.")
+                       "%s: %s %s\n", 
+                       _("Setup could not connect to a running Citadel server."),
+                       strerror(errno), file_citadel_admin_socket
                );
                exit(1);
        }
@@ -1283,7 +1297,6 @@ int main(int argc, char *argv[])
                ++a;
        }
 
-
        /*
         * Now begin.
         */
@@ -1291,10 +1304,7 @@ int main(int argc, char *argv[])
        /* _("Citadel Setup"),  */
 
        if (setup_type == UI_TEXT) {
-               printf("\n\n\n"
-                       "              *** %s ***\n\n",
-                       _("Citadel setup program")
-               );
+               printf("\n\n\n         *** %s ***\n\n", program_title);
        }
 
        if (setup_type == UI_DIALOG) {
@@ -1306,15 +1316,29 @@ int main(int argc, char *argv[])
        /* 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)
                ) {
                        curr += 5;      /* skip LDAP questions if we're not authenticating against LDAP */
                }
-       }
 
-       //config.c_setup_level = REV_LEVEL;
+               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]);
+                               serv_puts(buf);
+                               serv_gets(buf);
+                               if (buf[0] == '2') {
+                                       extract_token(admin_pass, &buf[4], 1, '|', sizeof admin_pass);
+                               }
+                       }
+                       else {
+                               ++curr;         /* skip the password question for non-native auth modes */
+                       }
+               }
+       }
 
        if ((pw = getpwuid(atoi(configs[69]))) == NULL) {
                gid = getgid();
@@ -1325,19 +1349,45 @@ int main(int argc, char *argv[])
        create_run_directories(atoi(configs[69]), gid);
 
        activity = _("Reconfiguring Citadel server");
-       progress(activity, 0, NUM_CONFIGS+1);
+       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<NUM_CONFIGS; ++i) {
-                       progress(activity, i+1, NUM_CONFIGS+1);
+                       progress(activity, i+1, NUM_CONFIGS+3);
                        serv_puts(configs[i]);
                }
                serv_puts("000");
        }
        sleep(1);                                       /* Let the message appear briefly */
-       progress(activity, NUM_CONFIGS+1, NUM_CONFIGS+1);
+
+       /*
+        * Create the administrator account.  It's ok if the command fails if this user already exists.
+        */
+       progress(activity, NUM_CONFIGS+1, NUM_CONFIGS+3);
+       snprintf(buf, sizeof buf, "CREU %s|%s", configs[13], admin_pass);
+       serv_puts(buf);
+       progress(activity, NUM_CONFIGS+2, NUM_CONFIGS+3);
+       serv_gets(buf);
+       progress(activity, NUM_CONFIGS+3, NUM_CONFIGS+3);
+
+       /*
+        * Assign the desired password and access level to the administrator account.
+        */
+       snprintf(buf, sizeof buf, "AGUP %s", configs[13]);
+       serv_puts(buf);
+       serv_gets(buf);
+       if (buf[0] == '2') {
+               int admin_flags = extract_int(&buf[4], 2);
+               int admin_times_called = extract_int(&buf[4], 3);
+               int admin_msgs_posted = extract_int(&buf[4], 4);
+               snprintf(buf, sizeof buf, "ASUP %s|%s|%d|%d|%d|6",
+                       configs[13], admin_pass, admin_flags, admin_times_called, admin_msgs_posted
+               );
+               serv_puts(buf);
+               serv_gets(buf);
+       }
 
 #ifndef __CYGWIN__
        check_xinetd_entry();   /* Check /etc/xinetd.d/telnet */
@@ -1374,12 +1424,12 @@ int main(int argc, char *argv[])
        close(serv_sock);
        serv_sock = (-1);
 
-       for (i=3; i<=6; ++i) {
+       for (i=3; i<=6; ++i) {                                  /* wait for server to shut down */
                progress(activity, i, 41);
                sleep(1);
        }
 
-       for (i=7; ((i<=38) && (serv_sock < 0)) ; ++i) {
+       for (i=7; ((i<=38) && (serv_sock < 0)) ; ++i) {         /* wait for server to start up */
                progress(activity, i, 41);
                serv_sock = uds_connectsock(file_citadel_admin_socket);
                sleep(1);
@@ -1396,7 +1446,9 @@ int main(int argc, char *argv[])
        close(serv_sock);
        progress(activity, 41, 41);
 
-       if (original_start_time == new_start_time) {
+       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.")
                );